diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..b31824d --- /dev/null +++ b/Makefile @@ -0,0 +1,2 @@ +markdown: + python ./utils/html2text.py index.html > index.md diff --git a/index.md b/index.md new file mode 100644 index 0000000..a8d1bcc --- /dev/null +++ b/index.md @@ -0,0 +1,4048 @@ + * [Bloomberg the Company ](http://www.bloomberg.com/company/?tophat=open) + * [Bloomberg Anywhere Login ](https://bba.bloomberg.net/) + +[![](http://www.bloomberg.com/graphics/assets/img/BB-Logo-2line- +wb.svg)](http://bloomberg.com/) + +![](http://www.bloomberg.com/graphics/assets/img/twitter.png)![](http://www.bl +oomberg.com/graphics/assets/img/twitter_w.png) + +![](http://www.bloomberg.com/graphics/assets/img/facebook.png)![](http://www.b +loomberg.com/graphics/assets/img/facebook_w.png) + +# WHAT _IS_ + +## BUSINESSWEEK JUNE 11, 2015 + +## BY PAUL FORD + +# CODE?| + +![](images/letter.jpg) A message from Josh Tyrangiel + +Software has been around since the 1940s. Which means that people have been +faking their way through meetings about software, and the code that builds it, +for generations. Now that software lives in our pockets, runs our cars and +homes, and dominates our waking lives, ignorance is no longer acceptable. The +world belongs to people who code. Those who don’t understand will be left +behind. + +This issue comprises a single story devoted to ­demystifying code and the +culture of the people who make it. There’s some technical language along with +a few pretty basic mathematical concepts. There are also lots of solid jokes +and lasting insights. It may take a few hours to read, but that’s a small +price to pay for adding decades to your career. + +_--Josh Tyrangiel_ + +1 + +## The Man in the Taupe Blazer + +You are an educated, successful person capable of abstract thought. A VP doing +an SVP's job. Your office, appointed with decent furniture and a healthy +amount of natural light filtered through vertical blinds, is commensurate with +nearly two decades of service to the craft of management. + +Copper plaques on the wall attest to your various leadership abilities inside +and outside the organization: One, the Partner in Innovation Banquet Award +2011, is from the sales team for your support of its 18-month effort to reduce +cycle friction--net sales increased 6.5 percent; another, the Civic Guidelight +2008, is for overseeing a volunteer team that repainted a troubled public +school top to bottom. + +You have a reputation throughout the organization as a careful person, +bordering on penny-pinching. The way you'd put it is, you are loath to pay for +things that can't be explained. You expect your staff to speak in plain +language. This policy has served you well in many facets of operations, but it +hasn't worked at all when it comes to overseeing software development. + +For your entire working memory, _some Internet thing_ has come along every two +years and suddenly hundreds of thousands of dollars (inevitably millions) must +be poured into amorphous projects with variable deadlines. Content management +projects, customer relationship management integration projects, mobile apps, +paperless office things, global enterprise resource planning initiatives--no +matter how tightly you clutch the purse strings, software finds a way to pry +open your fingers. + +Here we go again. On the other side of your (well-organized) desk sits _this +guy_ in his mid-30s with a computer in his lap. He's wearing a taupe blazer. +He's come to discuss spending large sums to create intangible abstractions on +a "website re-architecture project." He needs money, support for his team, new +hires, external resources. It's preordained that you'll give these things to +him, because the CEO signed off on the initiative--and yet should it all go +pear-shaped, you will be responsible. Coders are insanely expensive, and +projects that start with uncomfortably large budgets have an ugly tendency to +grow from there. You need to understand where the hours will go. + +![](images/sec1_taupe.jpg) + +Photographer: Corey Olsen for Bloomberg Businessweek + +He says: "We're basically at the limits with WordPress." + +Who wears a taupe blazer? + +The CTO was fired six months ago. That CTO has three kids in college and a +mustache. It was a bad exit. The man in the taupe blazer (TMitTB) works for +the new CTO. She comes from Adobe and has short hair and no mustache. + +Here is what you've been told: All of the computer code that keeps the website +running must be replaced. At one time, it was very valuable and was keeping +the company running, but the new CTO thinks it's garbage. She tells you the +old code is spaghetti and your systems are straining as a result. That the +third-party services you use, and pay for monthly, are old and busted. Your +competitor has an animated shopping cart that drives across the top of the +screen at checkout. That cart remembers everything customers have ever +purchased and generates invoices on demand. Your cart has no memory at all. + +Salespeople stomp around your office, sighing like theater students, telling +you how embarrassed they are by the site. Nothing works right on mobile. +Orders are cutting off halfway. People are logged out with no warning. +Something must be done. + +Which is why TMitTB is here. + +Who's he, anyway? Webmaster? IT? No, he's a "Scrum Master." + +"My people are split on platform," he continues. "Some want to use Drupal 7 +and make it work with Magento--which is still PHP." He frowns. "The other +option is just doing the back end in Node.js with Backbone in front." + +You've furrowed your brow; he eyes you sympathetically and explains: "With +that option it's all JavaScript, front and back." + +Those are all terms you've heard. You've read the first parts of the Wikipedia +pages and a book on software project estimation. It made some sense at the +time. + +You ask the universal framing question: "Did you cost these options?" + +He gives you a number and a date. You know in your soul that the number is +half of what it should be and that the project will go a year over schedule. +He promises long-term efficiencies: The $85,000 in Oracle licenses will no +longer be needed; engineering is moving to a free, open-sourced database. "We +probably should have done that back when we did the Magento migration," he +says. Meaning, of course, that his predecessor probably should have done that. + +You consult a spreadsheet and remind him that the Oracle contract was renewed +a few months ago. So, no, actually, at least for now, you'll keep eating that +cost. Sigh. + +This man makes a third less than you, and his education ended with a B.S. from +a large, perfectly fine state university. But he has 500+ connections on +LinkedIn. That plus sign after the "500" bothers you. How many more than 500 +people does he know? Five? Five thousand? + +In some mysterious way, he outranks you. Not within the company, not in +restaurant reservations, not around lawyers. Still: He strokes his short +beard; his hands are tanned; he hikes; his socks are embroidered with little +ninja. + +"Don't forget," he says, "we've got to budget for apps." + +This is real. A Scrum Master in ninja socks has come into your office and +said, "We've got to budget for apps." Should it all go pear-shaped, his career +will be just fine. + +You keep your work in perspective by thinking about barrels of cash. You once +heard that a U.S. dry barrel can hold about $100,000 worth of singles. Next +year, you'll burn a little under a barrel of cash on Oracle. One barrel isn't +that bad. But it's never one barrel. Is this a 5-barrel project or a +10-barreler? More? Too soon to tell. But you can definitely smell money +burning. + +At this stage in the meeting, you like to look supplicants in the eye and say, +_OK, you've given me a date and a budget_. But when will it be done? Really, +truly, top-line-revenue-reporting finished? Come to confession; unburden your +soul. + +This time you stop yourself. You don't want your inquiry to be met by a +patronizing sigh of impatience or another explanation about ship dates, Agile +cycles, and continuous delivery. Better for now to hide your ignorance. _When +will it be done?_ You are learning to accept that the answer for software +projects is _never_. + +![](images/emotes/taupe.gif) + +### 1.1 Why Are We Here? + +We are here because the editor of this magazine asked me, "Can you tell me +what code is?" + +"No," I said. "First of all, I'm not good at the math. I'm a programmer, yes, +but I'm an East Coast programmer, not one of these serious platform people +from the Bay Area." + +I began to program nearly 20 years ago, learning via `oraperl`, a special +version of the Perl language modified to work with the Oracle database. A +month into the work, I damaged the accounts of 30,000 fantasy basketball +players. They sent some angry e-mails. After that, I decided to get better. + +Which is to say I'm not a natural. I love computers, but they never made any +sense to me. And yet, after two decades of jamming information into my code- +resistant brain, I've amassed enough knowledge that the computer has revealed +itself. Its magic has been stripped away. I can talk to someone who used to +work at Amazon.com or Microsoft about his or her work without feeling a +burning shame. I'd happily talk to people from Google and Apple, too, but they +so rarely reenter the general population. + +The World Wide Web is what I know best (I've coded for money in the +programming languages Java, JavaScript, Python, Perl, PHP, Clojure, and XSLT), +but the Web is only one small part of the larger world of software +development. There are 11 million professional software developers on earth, +according to the research firm IDC. (An additional 7 million are hobbyists.) +That's roughly the population of the greater Los Angeles metro area. Imagine +all of L.A. programming. East Hollywood would be for Mac programmers, West +L.A. for mobile, Beverly Hills for finance programmers, and all of Orange +County for Windows. + +There are lots of other neighborhoods, too: There are people who write code +for embedded computers smaller than your thumb. There are people who write the +code that runs your TV. There are programmers for everything. They have +different cultures, different tribal folklores, that they use to organize +their working life. If you told me a systems administrator was taking a +juggling class, that would make sense, and I'd expect a product manager to +take a trapeze class. I've met information architects who list and rank their +friendships in spreadsheets. Security research specialists love to party. + +What I'm saying is, I'm one of 18 million. So that's what I'm writing: my view +of software development, as an individual among millions. Code has been my +life, and it has been your life, too. It is time to understand how it all +works. + +Every month it becomes easier to do things that have never been done before, +to create new kinds of chaos and find new kinds of order. Even though my math +skills will never catch up, I love the work. Every month, code changes the +world in some + +interesting, ![](images/sec1_interesting.jpg) + +wonderful, ![](images/sec1_wonderful.jpg) + +or disturbing way. ![](images/sec1_horrible.jpg) + +2 + +## Let's Begin + +A computer is a clock with benefits. They all work the same, doing second- +grade math, one step at a time: Tick, take a number and put it in box one. +Tick, take another number, put it in box two. Tick, _operate_ (an operation +might be addition or subtraction) on those two numbers and put the resulting +number in box one. Tick, check if the result is zero, and if it is, go to some +other box and follow a new set of instructions. + +![](images/twitter-blk.png) + +You, using a pen and paper, can do anything a computer can; you just can't do +those things billions of times per second. And those billions of tiny +operations add up. They can cause a phone to boop, elevate an elevator, or +redirect a missile. That raw speed makes it possible to pull off not one but +multiple sleights of hand, card tricks on top of card tricks. Take a bunch of +pulses of light reflected from an optical disc, apply some math to unsqueeze +them, and copy the resulting pile of expanded impulses into some memory cells +--then read from those cells to paint light on the screen. Millions of pulses, +60 times a second. That's how you make the rubes believe they're watching a +movie. + +Apple has always made computers; Microsoft used to make only software (and +occasional accessory hardware, such as mice and keyboards), but now it's in +the hardware business, with Xbox game consoles, Surface tablets, and Lumia +phones. Facebook assembles its own computers for its massive data centers. + +So many things are computers, or will be. That includes watches, cameras, air +conditioners, cash registers, toilets, toys, airplanes, and movie projectors. +Samsung makes computers that look like TVs, and Tesla makes computers with +wheels and engines. Some things that aren't yet computers--dental floss, +flashlights--will fall eventually. + +When you "batch" process a thousand images in Photoshop or sum numbers in +Excel, you're programming, at least a little. When you use computers too much +--which is to say a typical amount--they start to change you. I've had +Photoshop dreams, Visio dreams, spreadsheet dreams, and Web browser dreams. +The dreamscape becomes fluid and can be sorted and restructured. I've had +programming dreams where I move text around the screen. + +You can make computers do wonderful things, but you need to understand their +limits. They're not all-powerful, not conscious in the least. They're fast, +but some parts--the processor, the RAM--are faster than others--like the hard +drive or the network connection. Making them seem infinite takes a great deal +of work from a lot of programmers and a lot of marketers. + +The turn-of-last-century British artist William Morris once said you can't +have art without resistance in the materials. The computer and its +multifarious peripherals are the materials. The code is the art. + +### 2.1 How Do You Type an "A"? + +Consider what happens when you strike a key on your keyboard. Say a lowercase +"a." The keyboard is waiting for you to press a key, or release one; it's +constantly scanning to see what keys are pressed down. Hitting the key sends a +scancode. + +![](images/twitter-blk.png) + +Just as the keyboard is waiting for a key to be pressed, the computer is +waiting for a signal from the keyboard. When one comes down the pike, the +computer interprets it and passes it farther into its own interior. "Here's +what the keyboard just received--do with this what you will." + +It's simple now, right? The computer just goes to some table, figures out that +the signal corresponds to the letter "a," and puts it on screen. Of course not +--too easy. Computers are machines. They don't know what a screen or an "a" +are. To put the "a" on the screen, your computer has to pull the image of the +"a" out of its memory as part of a font, an "a" made up of lines and circles. +It has to take these lines and circles and render them in a little box of +pixels in the part of its memory that manages the screen. So far we have at +least three representations of one letter: the signal from the keyboard; the +version in memory; and the lines-and-circles version sketched on the screen. +We haven't even considered how to store it, or what happens to the letters to +the left and the right when you insert an "a" in the middle of a sentence. Or +what "lines and circles" mean when reduced to binary data. There are +surprisingly many ways to represent a simple "a." It's amazing any of it works +at all. + +Coders are people who are willing to work backward to that key press. It takes +a certain temperament to page through standards documents, manuals, and +documentation and read things like "data fields are transmitted least +significant bit first" in the interest of understanding why, when you expected +"u," you keep getting "�." + +### 2.2 From Hardware to Software + +Hardware is a tricky business. For decades the work of integrating, building, +and shipping computers was a way to build fortunes. But margins tightened. +Look at Dell, now back in private hands, or Gateway, acquired by Acer. Dell +and Gateway, two world-beating companies, stayed out of software, typically +building PCs that came preinstalled with Microsoft Windows--plus various +subscription-based services to increase profits. + +This led to much cursing from individuals who'd spent $1,000 or more on a +computer and now had to figure out how to stop the antivirus software from +nagging them to pay up. + +![Steve Ballmer](images/ballmer.gif) + +Ballmer chants “Developers!” + +Source: Youtube + +Years ago, when Microsoft was king, Steve Ballmer, sweating through his blue +button-down, jumped up and down in front of a stadium full of people and +chanted, "Developers! Developers! Developers! Developers!" + +He yelled until he was hoarse: "I love this company!" Of course he did. If you +can sell the software, if you can light up the screen, you're selling +infinitely reproducible nothings. The margins on nothing are great--until +other people start selling even cheaper nothings or giving them away. Which is +what happened, as free software-based systems such as Linux began to nibble, +then devour, the server market, and free-to-use Web-based applications such as +Google Apps began to serve as viable replacements for desktop software. + +Expectations around software have changed over time. IBM unbundled software +from hardware in the 1960s and got to charge more; Microsoft rebundled +Internet Explorer with Windows in 1998 and got sued; Apple initially refused +anyone else the ability to write software for the iPhone when it came out in +2007, and then opened the App Store, which expanded into a vast commercial +territory--and soon the world had Angry Birds. Today, much hardware comes with +some software--a PC comes with an operating system, for example, and that OS +includes hundreds of subprograms, from mail apps to solitaire. Then you +download or buy more. + +There have been countless attempts to make software easier to write, promising +that you could code in plain English, or manipulate a set of icons, or make a +list of rules--software development so simple that a bright senior executive +or an average child could do it. Decades of efforts have gone into helping +civilians write code as they might use a calculator or write an e-mail. +Nothing yet has done away with _developers, developers, developers, +developers._ + +Thus a craft, and a professional class that lives that craft, emerged. +Beginning in the 1950s, but catching fire in the 1980s, a proportionally small +number of people became adept at inventing ways to satisfy basic human desires +(know the time, schedule a flight, send a letter, kill a zombie) by +controlling the machine. Coders, starting with concepts such as "signals from +a keyboard" and "numbers in memory," created infinitely reproducible units of +digital execution that we call software, hoping to meet the needs of the +marketplace. Man, did they. The systems they built are used to manage the +global economic infrastructure. 1 If coders don't run the world, they run the +things that run the world. + +Most programmers aren't working on building a widely recognized application +like Microsoft Word. Software is everywhere. It's gone from a craft of +fragile, built-from-scratch custom projects to an industry of standardized +parts, where coders absorb and improve upon the labors of their forebears +(even if those forebears are one cubicle over). Software is there when you +switch channels and your cable box shows you what else is on. You get money +from an ATM--software. An elevator takes you up five stories--the same. +Facebook releases software every day to something like a billion people, and +that software runs inside Web browsers and mobile applications. Facebook looks +like it's just pictures of your mom's crocuses or your son's school play--but +no, it's software. + +![](images/sec1_rubegoldberg.jpg) + +Photographer: Boru O'Brien O'Connell for Bloomberg Businessweek; Set design: +Dave Bryant + +### 2.3 How Does Code Become Software? + +We know that a computer is a clock with benefits, and that software starts as +code, but how? + +We know that someone, somehow, enters a program into the computer and the +program is made of code. In the old days, that meant putting holes in punch +cards. Then you'd put the cards into a box and give them to an operator who +would load them, and the computer would flip through the cards, identify where +the holes were, and update parts of its memory, and then it would--OK, that's +a little too far back. Let's talk about modern typing-into-a-keyboard code. It +might look like this: + + + ispal: {x~|x} + +That's in a language called, simply, K, famous for its brevity. 2 That code +will test if something is a palindrome. If you next typed in `ispal "able was +i ere i saw elba"`, K will confirm that yes, this is a palindrome. + +So how else might your code look? Maybe like so, in Excel (with all the +formulas hidden away under the numbers they produce, and a check box that you +can check): + +![Excel](images/sec1_excel.jpg) + +But Excel spreadsheets are tricky, because they can hide all kinds of things +under their numbers. This opacity causes risks. One study by a researcher at +the University of Hawaii found that 88 percent of spreadsheets contain errors. + +Programming can also look like Scratch, a language for kids: + +![Scratch](images/sec1_excel2.jpg) + +That's definitely programming right there--the computer is waiting for a +click, for some input, just as it waits for you to type an "a," and then it's +doing something repetitive, and it involves hilarious animals. + +Or maybe: + + + PRINT *, "WHY WON'T IT WORK + END + + + +That's in Fortran. The reason it's not working is that you forgot to put a +quotation mark at the end of the first line. Try a little harder, thanks. + +All of these things are coding of one kind or another, but the last bit is +what most programmers would readily identify as code. A sequence of symbols +(using typical keyboard characters, saved to a file of some kind) that someone +typed in, or copied, or pasted from elsewhere. That doesn't mean the other +kinds of coding aren't valid or won't help you achieve your goals. Coding is a +broad human activity, like sport, or writing. When software developers think +of coding, most of them are thinking about lines of code in files. They're +handed a problem, think about the problem, write code that will solve the +problem, and then expect the computer to turn word into deed. + +Code is inert. How do you make it ert? You run software that transforms it +into machine language. The word "language" is a little ambitious here, given +that you can make a computing device with wood and marbles. Your goal is to +turn your code into an explicit list of instructions that can be carried out +by interconnected logic gates, thus turning your code into something that can +be executed--software. + +A compiler is software that takes the symbols you typed into a file and +transforms them into lower-level instructions. Imagine a programming language +called Business Operating Language United System, or Bolus. It's a terrible +language that will have to suffice for a few awkward paragraphs. It has one +real command, `PRINT`. We want it to print `HELLO NERDS` on our screen. To +that end, we write a line of code in a text file that says: + + + PRINT {HELLO NERDS} + +And we save that as `nerds.bol`. Now we run `gnubolus nerds.bol`, our +imaginary compiler program. How does it start? The only way it can: by doing +lexical analysis, going character by character, starting with the "p," +grouping characters into tokens, saving them into our one-dimensional tree +boxes. Let's be the computer. + +Character Meaning + +P + +_Hmmmm...?_ + +R + +_Someone say something?_ + +I + +_I'm waiting..._ + +N + +[drums fingers] + +T + +_Any time now..._ + +Space + +_Ah, "PRINT"_ + +{ + +_String coming!_ + +H + +_These_ + +E + +_letters__ + +L + +_don't_ + +L + +_matter_ + +O + +_la_ + +Space + +_la_ + +N + +_just_ + +E + +_saving_ + +R + +_them_ + +D + +_for_ + +S + +_later_ + +} + +_Stringtime is over!_ + +End of file + +_Time to get to work._ + +The reason I'm showing it to you is so you can see how every character +matters. Computers usually "understand" things by going character by +character, bit by bit, transforming the code into other kinds of code as they +go. The Bolus compiler now organizes the tokens into a little tree. Kind of +like a sentence diagram. Except instead of nouns, verbs, and adjectives, the +computer is looking for functions and arguments. Our program above, inside the +computer, becomes this: + +![](images/sec1_tree.jpg) + +Trees are a really pleasant way of thinking of the world. Your memo at work +has sections that have paragraphs? Tree. Your e-mail program contains messages +that contain subject lines and addresses? Tree. Your favorite software program +that has a menu bar with individual items that have subitems? Tree. Every day +is Arbor Day in Codeville. + +![](images/twitter-blk.png) + +Of course, it's all a trick. If you cut open a computer, you'll find countless +little boxes in rows, places where you can put and retrieve bytes. Everything +ultimately has to get down to things in little boxes pointing to each other. +That's just how things work. So that tree is actually more like this: + +![](images/sec1_tree2.jpg) + +Every character truly, truly matters. Every single stupid misplaced semicolon, +space where you meant tab, bracket instead of a parenthesis--mistakes can +leave the computer in a state of panic. The trees don't know where to put +their leaves. Their roots decay. The boxes don't stack neatly. For not only +are computers as dumb as a billion marbles, they're also positively +Stradivarian in their delicacy. + +That process of going character by character can be wrapped up into a routine +--also called a function, a method, a subroutine, or component. (Little in +computing has a single, reliable name, which means everyone is always arguing +over semantics.) And that routine can be run as often as you need. Second, you +can print anything you wish, not just one phrase. Third, you can repeat the +process forever, and nothing will stop you until the machine breaks or, +barring that, heat death of the universe. Obviously no one besides Jack +Nicholson in _The Shining_ really needs to keep typing the same phrase over +and over, and even then it turned out to be a bad idea. + +Instead of worrying about where the words are stored in memory and having to +go character by character, programming languages let you think of things like +strings, arrays, and trees. That's what programming gives you. You may look +over a programmer's shoulder and think the code looks complex and boring, but +it's covering up repetitive boredom that's unimaginably vast. 3 + +This thing we just did with individual characters, compiling a program down +into a fake assembly language so that the nonexistent computer can print each +character one at a time? The same principle applies to every pixel on your +screen, every frequency encoded in your MP3 files, and every imaginary cube in +Minecraft. Computing treats human language as an arbitrary set of symbols in +sequences. It treats music, imagery, and film that way, too. + +It's a good and healthy exercise to ponder what your computer is doing right +now. Maybe you're reading this on a laptop: What are the steps and layers +between what you're doing and the Lilliputian mechanisms within? When you +double-click an icon to open a program such as a word processor, the computer +must know where that program is on the disk. It has some sort of accounting +process to do that. And then it loads that program into its memory--which +means that it loads an enormous to-do list into its memory and starts to step +through it. What does that list look like? + +Maybe you're reading this in print. No shame in that. In fact, thank you. The +paper is the artifact of digital processes. Remember how we put that "a" on +screen? See if you can get from some sleepy writer typing that letter on a +keyboard in Brooklyn, N.Y., to the paper under your thumb. What framed that +fearful symmetry? + +Thinking this way will teach you two things about computers: One, there's no +magic, no matter how much it looks like there is. There's just work to make +things look like magic. And two, it's crazy in there. + +![Magic](images/sec3_magic.jpg) + +Photographer: Asger Carlsen for Bloomberg Businessweek; Set Design: Dave +Bryant + +### 2.4 What Is an Algorithm? + +"Algorithm" is a word writers invoke to sound smart about technology. +Journalists tend to talk about "Facebook's algorithm" or a "Google algorithm," +which is usually inaccurate. They mean "software." + +Algorithms don't require computers any more than geometry does. An algorithm +solves a problem, and a great algorithm gets a name. Dijkstra's algorithm, +after the famed computer scientist Edsger Dijkstra, finds the shortest path in +a graph. By the way, "graph" here doesn't mean ![](images/sec1_graph1.jpg) but +rather ![](images/sec1_graph2.jpg) + +Think of a map; streets connect to streets at intersections. It's a graph! +There are graphs all around you. Plumbing, electricity, code compilation, +social networks, the Internet, all can be represented as graphs! (Now to +monetize …) + +Many algorithms have their own pages on Wikipedia. You can spend days poking +around them in wonder. [Euclid's +algorithm](https://en.wikipedia.org/wiki/Euclidean_algorithm), for example, is +the go-to specimen that shows up whenever anyone wants to wax on about +algorithms, so why buck the trend? It's a simple way of determining the +greatest common divisor for two numbers. Take two numbers, like 16 and 12. +Divide the first by the second. If there's a remainder (in this case there is, +4), divide the first, 16, by that remainder, 4, which gives you 4 and no +remainder, so we're done--and 4 is the greatest common divisor. (Now translate +that into machine code, and we can get out of here.) + +There's a site called Rosetta Code that shows you different algorithms in +different languages. The [Euclid's algorithm +page](http://rosettacode.org/wiki/Greatest_common_divisor) is great. Some of +the examples are suspiciously long and laborious, and some are tiny nonsense +poetry, like this one, in the language Forth:4 + + + : gcd ( a b -- n ) + begin dup while tuck mod repeat drop ; + +Read it out loud, preferably to friends. Forth is based on the concept of a +stack, which is a special data structure. You make "words" that do things on +the stack, building up a little language of your own. PostScript, 5 the +language of laser printers, came after Forth but is much like it. Look at how +similar the code is, give or take some squiggles: + + + /gcd { + { + {0 gt} {dup rup mod} {pop exit} ifte + } loop + }. + +And that's Euclid's algorithm in PostScript. I admit, this might be fun only +for me. Here it is in Python (all credit to Rosetta Code): + + + def gcd(u, v): + return gcd(v, u % v) if v else abs(u) + +A programming language is a system for encoding, naming, and organizing +algorithms for reuse and application. It's an algorithm management system. +This is why, despite the hype, it's silly to say Facebook has an algorithm. An +algorithm can be translated into a function, and that function can be called +(run) when software is executed. There are algorithms that relate to image +processing and for storing data efficiently and for rapidly running through +the elements of a list. Most algorithms come for free, already built into a +programming language, or are available, organized into libraries, for download +from the Internet in a moment. You can do a ton of programming without +actually thinking about algorithms--you can save something into a database or +print a Web page by cutting and pasting code. But if you want the computer to, +say, identify whether it's reading Spanish or Italian, you'll need to write a +language-matching function. So in that sense, algorithms can be pure, +mathematical entities as well as practical expressions of ideas on which you +can place your grubby hands. + +![](images/sec1_edward.jpg) + +Dijkstra distributed a remarkable and challenging set of 18 memos to the +global computer science community, starting in the 1960s and continuing up +until his death in 2002, known as "EWDs," many of them +[handwritten](http://www.cs.utexas.edu/~EWD/). + +One thing that took me forever to understand is that computers aren't actually +"good at math." They can be programmed to execute certain operations to +certain degrees of precision, so much so that it looks like "doing math" to +humans. 6 Dijkstra said: "Computer science is no more about computers than +astronomy is about telescopes." 7 A huge part of computer science is about +understanding the efficiency of algorithms--how long they will take to run. +Computers are fast, but they can get bogged down--for example, when trying to +find the shortest path between two points on a large map. Companies such as +Google, Facebook, and Twitter are built on top of fundamental computer science +8 and pay great attention to efficiency, because their users do things +(searches, status updates, tweets) an extraordinary number of times. Thus it's +absolutely worth their time to find excellent computer scientists, many with +doctorates, who know where all the efficiencies are buried. + +It takes a good mathematician to be a computer scientist, but a middling one +to be an effective programmer. Until you start dealing with millions of people +on a network or you need to blur or sharpen a million photos quickly, you can +just use the work of other people. When it gets real, break out the comp sci. +When you're doing anything a hundred trillion times, nanosecond delays add up. +Systems slow down, users get cranky, money burns by the barrel. 9 + +The hardest work in programming is getting around things that aren't +computable, in finding ways to break impossible tasks into small, possible +components, and then creating the impression that the computer is doing +something it actually isn't, like having a human conversation. This used to be +known as "artificial intelligence research," but now it's more likely to go +under the name "machine learning" or "data mining." When you speak to Siri or +Cortana and they respond, it's not because these services understand you; they +convert your words into text, break that text into symbols, then match those +symbols against the symbols in their database of terms, and produce an answer. +Tons of algorithms, bundled up and applied, mean that computers can fake +listening. + +A programming language has at least two jobs, then. It needs to wrap up lots +of algorithms so they can be reused. Then you don't need to go looking for a +square-root algorithm (or a genius programmer) every time you need a square +root. And it has to make it easy for programmers to wrap up new algorithms and +routines into functions for reuse. The DRY principle, for Don't Repeat +Yourself, is one of the colloquial tenets of programming. That is, you should +name things once, do things once, create a function once, and let the computer +repeat itself. This doesn't always work. Programmers repeat themselves +constantly. I've written certain kinds of code a hundred times. This is why +DRY is a principle. + +Enough talk. Let's code! + +### 2.5 The Sprint + +After a few months the budget is freed up, and the Web re-architecture project +is under way. They give it a name: Project Excelsior. Fine. TMitTB (who, to be +fair, has other clothes and often dresses like he's in Weezer) checks in with +you every week. + +He brings documents. Every document has its own name. The functional +specification is a set of at least a thousand statements about users clicking +buttons. "Upon accessing the Web page the user if logged in will be identified +by name and welcomed and if not logged in will be encouraged to log in or +create an account. (See user registration workflow.)" + +_God have mercy on our souls_. From there it lists various error messages. +It's a sort of blueprint in that it describes--in words, with occasional +diagrams--a program that doesn't exist. + +Some parts of the functional specification refer to "user stories," tiny +hypothetical narratives about people using the site, e.g., "As a visitor to +the website, I want to search for products so I can quickly purchase what I +want." 10 + +Then there's something TMitTB calls wireframe mock-ups, which are pictures of +how the website will look, created in a program that makes everything seem as +if it were sketched by hand, all a little squiggly--even though it was +produced on a computer. This is so no one gets the wrong idea about these +ideas-in-progress and takes them too seriously. Patronizing, but point taken. + +You rarely see TMitTB in person, because he's often at conferences where he +presents on panels. He then tweets about the panels and notes them on his +well-populated LinkedIn page. Often he takes a picture of the audience from +the stage, and what you see is an assembly of mostly men, many with beards, +the majority of whom seem to be peering into their laptop instead of up at the +stage. Nonetheless the tweet that accompanies that photo says something like, +"AMAZING audience! @ the panel on #microservice architecture at +#ArchiCon2015." + +He often tells you just how important this panel-speaking is for purposes of +recruiting. Who's to say he is wrong? It costs as much to hire a senior +programmer as it does to hire a midlevel executive, so maybe going to +conferences is his job, and in the two months he's been here he's hired four +people. His two most recent hires have been in Boston and Hungary, neither of +which is a place where you have an office. + +But what does it matter? Every day he does a 15-minute "standup" meeting via +something called Slack, which is essentially like Google Chat but with some +sort of plaid visual theme, and the programmers seem to agree that this is a +wonderful and fruitful way to work. + +"I watch the commits," TMitTB says. Meaning that every day he reviews the code +that his team writes to make sure that it's well-organized. "No one is pushing +to production without the tests passing. We're good." + +Your meetings, by comparison, go for hours, with people arranged around a +table--sitting down. You wonder how he gets his programmers to stand up, but +then some of them already use standing desks. Perhaps that's the ticket. + +Honestly, you would like to go to conferences sometimes and be on panels. You +could drink bottled water and hold forth just fine. + +### 2.6 What's With All These Conferences, Anyway? + +Conferences! The website Lanyrd lists hundreds of technology conferences for +June 2015. There's an event for software testers in Chicago, a Twitter +conference in São Paulo, and one on enterprise content management in +Amsterdam. In New York alone there's the Big Apple Scrum Day, the Razorfish +Tech Summit, an entrepreneurship boot camp for veterans, a conference +dedicated to digital mapping, many conferences for digital marketers, one +dedicated to Node.js, one for Ruby, and one for Scala (these are programming +languages), a couple of breakfasts, a conference for cascading style sheets, +one for text analytics, and something called the Employee Engagement Awards. + +Tech conferences look like you'd expect. Tons of people at a Sheraton, keynote +in Ballroom D. Or enormous streams of people wandering through South by +Southwest in Austin. People come together in the dozens or thousands and +attend panels, ostensibly to learn; they attend presentations and brush up +their skills, but there's a secondary conference function, one of +acculturation. You go to a technology conference to affirm your tribal +identity, to transfer out of the throng of dilettantes and into the zone of +the professional. You pick up swag and talk to vendors, if that's your thing. + +![](images/sec1_conference04.jpg)![](images/sec1_conference02.jpg)![](images/s +ec1_conference06.jpg)![](images/sec1_conference11.jpg)![](images/sec1_conferen +ce09.jpg)![](images/sec1_conference03.jpg)![](images/sec1_conference07.jpg)![] +(images/sec1_conference08.jpg)![](images/sec1_conference05.jpg)![](images/sec1 +_conference10.jpg)![](images/sec1_conference01.jpg)![](images/sec1_conference1 +2.jpg) + +**First row:** TechCrunch Disrupt NYC, May 2011; Google I/O developers conference, San Francisco, May 2013; Global Mobile Internet Conference, Beijing, April 2015 +**Second row:**Nvidia GPU, San Jose, September 2010; South by Southwest (SXSW) Interactive Festival, Austin, March 2013; Apple Worldwide Developers Conference (WWDC), San Francisco, June 2008 +**Third row:** TechCrunch Disrupt NYC, May 2012; Re:publica conference, Berlin, May 2015; TechCrunch Disrupt NYC, May 2015 +**Fourth row:** SXSW Interactive Festival, Austin, March 2014; WWDC, San Francisco, June 2015; Bloomberg Technology Conference!, San Francisco, June 15-16 + +Technology conferences are where primate dynamics can be fully displayed, +where relationships of power and hierarchy can be established. There are +keynote speakers--often the people who created the technology at hand or +crafted a given language. There are the regular speakers, often paid not at +all or in airfare, who present some idea or technique or approach. Then there +are the panels, where a group of people are lined up in a row and forced into +some semblance of interaction while the audience checks its e-mail. + +I'm a little down on panels. They tend to drift. I'm not sure why they exist. + +Here's the other thing about technology conferences: There has been much +sexual harassment and much sexist content in conferences. Which is stupid, +because computers are dumb rocks lacking genitalia, but there you have it. + +Women in software, having had enough, started to write it up, post to blogs. +Other women did the same. The problem is pervasive: There are a lot of +conferences, and there have been many reports of harassing behavior. The +language Ruby, the preferred language for startup bros, developed the worst +reputation. At a Ruby conference in 2009, someone gave a talk subtitled +"Perform Like a Pr0n Star," with sexy slides. That was dispiriting. There have +been criminal incidents, too. + +Conferences began to develop codes of conduct, rules and algorithms for people +(men, really) to follow. + +If you are subject to or witness unacceptable behavior, or have any other +concerns, please notify a community organizer as soon as possible … + +--_[Burlington Ruby Conference](http://www.burlingtonrubyconference.com/conduct)_ + +php[architect] is dedicated to providing a harassment-free event experience +for everyone and will not tolerate harassment or offensive behavior in any +form. + +--_[php[architect]](http://www.phparch.com/policies/code-of-conduct/)_ + +The Atlanta Java Users Group (AJUG) is dedicated to providing an outstanding +conference experience for all attendees, speakers, sponsors, volunteers, and +organizers involved in DevNexus (GeekyNerds) regardless of gender, sexual +orientation, disability, physical appearance, body size, race, religion, +financial status, hair color (or hair amount), platform preference, or text +editor of choice. + +--_[devnexus](https://www.devnexus.com/s/code-of-conduct)_ + +When people started talking about conference behavior, they also began to talk +about the larger problems of programming culture. This was always an issue, +but the conference issues gave people a point of common reference. Why were +there so many men in this field? Why do they behave so strangely? Why is it so +hard for them to be in groups with female programmers and behave in a typical, +adult way? + +![](images/emotes/swagbot.gif) + +![](images/emotes/conferencebot.gif) + +![](images/emotes/drinkbot.gif) + +"I go to work and I stick out like a sore thumb. I have been mistaken for an +administrative assistant more than once. I have been asked if I was physical +security (despite security wearing very distinctive uniforms)," wrote a black +woman on Medium.com who has worked, among other places, at Google. + +#### Famous women in coding history + + +Ada Lovelace: The first programmer. She devised algorithms for Charles +Babbage's "analytical engine," which he never built. + +![Ada Lovelace](images/sec1_lovelace.jpg) Grace Murray Hopper: World War II +hero and inventor of the compiler. + +![Grace Murray](images/sec1_hopper.jpg) + +"Always the only woman in the meeting, often the first--the first female R&D +engineer, first female project lead, first female software team lead--in the +companies I worked for," wrote another woman in _[Fast +Company](http://www.fastcompany.com/3008216/tracking/minding-gap-how-your- +company-can-woo-female-coders)_ magazine. + +Fewer than a fifth of undergraduate degrees in computer science awarded in +2012 went to women, according to the National Center for Women & Information +Technology. Less than 30 percent of the people in computing are women. And the +number of women in computing has fallen since the 1980s, even as the market +for their skills has expanded. The pipeline is a huge problem. And yet it's +not unsolvable. I've met managers who have built perfectly functional large +teams that are more than half female coders. Places such as the handicrafts +e-commerce site Etsy have made a particular effort to develop educational +programs and mentorship programs. Organizations such as the not-for-profit +Girl Develop It teach women, and just women, how to create software. + +It's all happening very late in the boom, though. In 2014 some companies began +to release diversity reports for their programming teams. It wasn't a popular +practice, but it was revealing. Intel is 23 percent female; Yahoo! is 37 +percent. Apple, Facebook, Google, Twitter, and Microsoft are all around 30 +percent. These numbers are for the whole companies, not only programmers. +That's a lot of women who didn't get stock options. The numbers of people who +aren't white or Asian are worse yet. Apple just gave $50 million to fund +diversity initiatives, equivalent to 0.007 percent of its market cap. Intel +has a $300 million diversity project. + +The average programmer is moderately diligent, capable of basic mathematics, +has a working knowledge of one or more programming languages, and can +communicate what he or she is doing to management and his or her peers. Given +that a significant number of women work as journalists and editors, perform +surgery, run companies, manage small businesses, and use spreadsheets, that a +few even serve on the Supreme Court, and that we are no longer surprised to +find women working as accountants, professors, statisticians, or project +managers, it's hard to imagine that they can't write JavaScript. Programming, +despite the hype and the self-serving fantasies of programmers the world over, +isn't the most intellectually demanding task imaginable. + +Which leads one to the inescapable conclusion: The problem with women in +technology isn't the women. + +![](images/sec1_demographics.jpg) + +3 + +## Why Are Programmers So Intense About Languages? + +Many conferences are organized around specific programming languages or +specific communities (PyCon for Python programmers; the Strata conference for +big data; Oscon for open-source coders); these are ritual events for the +people in those communities. Attendees gather, talk, and post the videos on +YouTube. Language matters. + +Programmers track the success of computer languages the way other people track +sports rankings, commenting on Web forums such as Reddit (where many languages +get their own "subreddit," and +[reddit.com/r/programming](http://www.reddit.com/r/programming) currently has +620,202 readers), or [Hacker News](https://news.ycombinator.com/), run by the +venture capital firm Y Combinator (a company named after a special kind of +function that operates on other functions), or [Lambda the Ultimate](http +://lambda-the-ultimate.org/) (named after a series of papers written mostly in +the 1970s about the influential programming language Scheme--the more inside- +baseball the name, the nerdier the subject matter). + +There are hundreds of programming blogs. Many large corporations let their +engineers blog (a generous gift, given how many recruiters are hovering). +Discussions about programming go on everywhere, in public, at all times, about +hundreds of languages. There is a keen sense of what's coming up and what's +fading out. + +It's not simply fashion; one's career as a programmer depends on demonstrating +capacity in one or more languages. So there are rankings, frequently updated, +rarely shocking. As of April 15, the world's most-used computer languages, +according to the Tiobe index (which uses a variety of indicators to generate a +single ranking for the world of programming), are Java, C, C++, Objective-C, +and C#, followed by JavaScript, PHP, and Python. The rankings are necessarily +inexact; another list, by a consulting firm called RedMonk, gives JavaScript +the top spot, followed by Java. There are many possible conclusions here, but +the obvious one is that, all things being equal, a very good Java programmer +who performs well in interviews will have more career options than a similar +candidate using a more obscure language. + +If you code, by the time a language breaks through to the top 10 or 20, you've +heard of it, read blog posts about it, heard people lament how terrible or +wonderful or misguided it is, possibly watched a few video tutorials, or +played with it a little. Taking new languages out for a spin is a good thing +for a programmer to do. Often all you have to do is download some files and +write a couple lines of code, then decide if you want to go further. Most +languages are free to download and use. + +Why do people construct and then give away free languages? Well, the creation +of a good computer language is the work of an apex programmer. To have +produced a successful language is acknowledged as a monumental effort, akin to +publishing a multivolume history of a war, or fighting in one. The reward is +glory. + +Changing a language is like fighting that war all over again, and some +languages have at times been trapped in a liminal state between their old, +busted selves, and their new, promised version. Perl 5, released in the mid- +1990s, was a language uniquely suited to the World Wide Web, and it grew as +the Web grew; Perl 6 was supposed to be better in every way, and a redesign +began with grand pronouncements in 2000. But after 15 years of people working +continually and often for free on a project they consider in the public +interest, there's still no official Perl 6. (Latest ETA: Christmas 2015.) + +The Python language community, keenly aware of the Perl community's problems, +decided to make necessary but difficult changes to the language as part of the +transition from Version 2 to Version 3. They would modernize, clean up rough +edges--but avoid grand reinventions. Development of Python 3.0 started in +2006; the first working version came out in 2008; and in 2015, the transition +is ongoing. + +Making a new language is hard. Making a popular language is much harder still +and requires the smile of fortune. And changing the way a popular language +works appears to be one of the most difficult things humans can do, requiring +years of coordination to make the standards align. Languages are large, +complex, dynamic expressions of human culture. + +P + +y + +thon + +Visual + +B + +asic + +Uni + +t + +ed + +C+ + ++ + +11 + +C + +WordPress + +M + +e + +xico + +(PHP) + +St + +a + +t + +es + +And + +r + +oid + +G + +r + +eece + +Indonesia + +P + +aki + +s + +tan + +F + +r + +ance + +Spain + +South + +A + +fri + +c + +a + +Nor + +w + +a + +y + +P + +ortugal + +R + +ussia + +Sw + +eden + +P + +oland + +Canada + +C + +z + +ech + +Germa + +n + +y + +R + +epublic + +A + +u + +s + +tria + +I + +r + +eland + +T + +ur + +k + +e + +y + +China + +N + +e + +w + +Z + +ealand + +B + +elgium + +B + +r + +azil + +Finland + +A + +r + +ge + +n + +tina + +I + +r + +an + +Uk + +r + +aine + +Node + +. + +js + +AngularJS + +iOS + +C# + +R + +u + +b + +y + +### 3.1 The Beauty of the Standard Library + +The true measure of a language isn't how it uses semicolons; it's the +_standard library_ of each language. A language is software for making +software. The standard library is a set of premade software that you can reuse +and reapply. + +Take Python, which is "batteries included," meaning that it comes with tons of +preexisting code, organized into "modules," that you can reuse. Its standard +library has functions that let you copy Web pages or replace words in a +document. + +![](images/twitter-blk.png) + +What does that mean, to process text? Well, you might have a string of text +(The Quick Brown Fox) and save it in a variable called `my_string`. So now you +can call standard methods on that string. You can say `my_string.lower()`, and +it will make all the words lowercase, producing "the quick brown fox." + +Truly understanding a language's standard library is one of the ways one +becomes proficient in that language. Typically you just visit Web pages or +read a book. + +But the standard library is only the beginning. For many languages--and Python +is exemplary--there's an enormous library of prewritten modules available for +nearly instantaneous download, using "package manager" software. A module (or +library, or package) is code that is intended to extend a language's +capabilities. + +Let's say you work for an advertising agency and need to process through +100,000 pictures and scale and sharpen them. + +You type one command: `sudo pip install Pillow`, and the Pillow module is +downloaded, compiled automatically, and placed into the correct directory for +later reuse. You have to know, of course, that most modern languages have +modules for image processing; you also need to know that Pillow is the most +commonly used image-processing toolkit. Knowing how to find that out is part +of the job of coding. You might learn it by Googling. You might ask a friend. +You might get that information out of a book, or a website like The +Hitchhiker's Guide to Python. + +A coder needs to be able to quickly examine and identify which giant, complex +library is the one that's the most recently and actively updated and the best +match for his or her current needs. A coder needs to be a good listener. + +But what a payoff! Now that Pillow is installed, you have, at your typing +fingertips, dozens of routines and functions related to image processing that +you can use in your code: change colors, rotate by a number of degrees, scale, +convert GIF images to JPEGs, and so forth. Or if you need to do very complex +numerical analysis and statistics work, you can download NumPy, and suddenly +an enormous range of mathematical algorithms are available to you, hundreds of +years of science and research boiled down. Audio processing, interacting with +peculiar hardware, speaking to databases--there are packages for all of these +things. But you need to know how to find them, what they are called. Code +isn't just obscure commands in a file. It requires you to have a map in your +head, to know where the good libraries, the best documentation, and the most +helpful message boards are located. If you don't know where those things are, +you will spend all of your time searching, instead of building cool new +things. + +### 3.2 What Do Different Languages Do? + +![](images/sec2_fridgebike.jpg) + +Photographer: Steven Brahms for Bloomberg Businessweek; Prop Stylist: Zachary +Kinsella + +If all computer languages do the same thing (make the computer do what you +want), then why does it matter which one you choose? For the same reason that +you wouldn't take a bicycle to pick up a fridge or get a physical from an +oncological neurosurgeon. Some tools are better for certain jobs. + +It's possible for a C programmer and a Java programmer to read each other's +code, but it's harder to make C code and Java code work together. C and Java +represent the world in different ways, structure data in different ways, and +address the components of the computer in different ways. There are true +benefits to everyone on a team using the same language. They're all thinking +the same way about how to instruct the computer to process data. + +It's not necessary for every team across a big organization to use the same +language. In fact, it's often counterproductive. Large organizations have lots +of needs and use many languages and services to meet them. For example, Etsy +is built atop PHP--but its product-search service uses Java libraries, because +the solutions for search available in Java are great. + +Some programming languages, such as C, will do their best to do exactly as you +ask, even if that means crashing your computer. Others, like OCaml and +Haskell, are very constrained and ask a programmer to hew to a narrow form, +trying to steer you away from anything stupid. 11 + +Some languages have cute logos, like the Go gopher. + +![](images/sec2_gopher.jpg) + +There's Scratch, a teaching language for kids. It doesn't use text much at all +but allows li'l coders to move icons around on screen and assemble programs +like Legos. Its logo is a smiling cat on two legs. + +![](images/sec2_scratch.jpg) + +And then there's Lisp, which didn't come with a logo when it was first +proposed in the 1950s but now has a community-created five-eyed alien holding +a flag with its proboscis. Lisp is a classic language. There are some +languages that just have authority, elegance--canonical computer languages. + +![](images/sec2_lisp.jpg) + +And one of these is C. Most of the popular languages look a lot like it. C's +de facto logo is, well, the letter C. C is called C because it came after +another language. That language was called B. + +### 3.3 The Importance of C + +C is as big a deal as you can get in computing. Created by Dennis Ritchie +starting in the late 1960s at Bell Labs, it's the principal development +language of the UNIX operating system. Unix (lowercased now, to refer to the +idea of Unix instead of the branded version) is a simple operating system-- +basically it's a kernel 12 that manages memory and runs software, a large +collection of very small utility programs, and a "shell" that helps you knit +programs into "shell scripts." If you couldn't do what you needed with shell +scripts, you might write a new utility in C and add it to the utility library. +This was a nice and practical way of working, and it coincided with the rise +of various kinds of networks that today we refer to collectively as the +Internet. So Unix spread from Bell Labs to academia, to large industrial +systems, and eventually leached into the water supply of computing until it +was everywhere. And everywhere that Unix went, C was sure to go. + +![](images/sec2_pullup.jpg) + +Photographer: Jeremy Liebman for Bloomberg Businessweek + +C is a simple language, simple like a shotgun that can blow off your foot. It +allows you to manage every last part of a computer--the memory, files, a hard +drive--which is great if you're meticulous and dangerous if you're sloppy. +Software made in C is known for being fast. When you compile C, it doesn't +simply become a bunch of machine language in one go; there are many steps to +making it really, ridiculously fast. These are called optimizations, and they +are to programming what loopholes are to taxes. Think of C as sort of a plain- +spoken grandfather who grew up trapping beavers and served in several wars but +can still do 50 pullups. + +C's legendary, lucid manual and specification, _The C Programming Language_, +written by Ritchie and Brian Kernighan (known by its nickname, K&R), is a +quick and simple read--physically light in comparison with modern, heavy-stock +guides to programming on bookstore shelves. This recommended text was +published in 1978, when personal computing barely existed, back when a +computer was a large piece of industrial equipment used to control a +refrigeration system or calculate actuarial tables. It was in K&R that "Hello, +world!" became the canonical example program for any language. By convention, +almost every introduction to any programming language since then starts with a +variation on "Hello, world!" + +Here is the ur-text of computational self-introduction: + + + #include + + int main() + { + printf("Hello, world!\n"); + } + +Which will, when compiled and run, print "Hello, world!" to the screen. Let's +write a program where you give it a number x and it prints out all the squares +of the numbers from 1 to x--just the sort of practical, useful program that +always appears in programming tutorials to address the needs of people who +urgently require a list of squares. + + + #include + + void squares(int v) + { + for (int i=1;i + +

Make an account

+
+ Name: +
+ Email: + +
+ + + +And that looks like this: + +On today's agenda: How to make sure that registration is a positive experience +for users but also a secure experience for the company. The questions to be +discussed, the programmer tells you, are along the lines of, "Where will you +put this data? Will you put it in a text file? What will you do with it? How +will you act upon it?" + +Enter the remaining two programmers. Programmer A, who is senior, takes her +place at the whiteboard. … + +![Programmer A](images/emotes/chatter_Orange.gif) + +**Programmer A:** "Let's just start with e-mail validation." + +**Programmer B:** "Can you define valid?" + +![Programmer B](images/emotes/chatter_Blue.gif) + +![Programmer B](images/emotes/chatter_Green.gif) + +**Programmer C:** "A well-formed--" + +--well-formed via a regular expression test? + +--or well-formed according to RFC 5321 and RFC 5322? + +Let's assume a library, OK? + +Do we send everyone who submits a form a confirmation message? + +We should, right? + +Is it in the spec? + +No. + +Then we shouldn't do it. + +Well, wait, maybe we should update the spec. + +It's best practice. + +Can I say what worries me? + +Wait-capture that. We need to check on confirmations. + +Got it. + +What really, really worries me are "temporary" e-mail services, right? Like +Mailinator.com, which allows you to give out "disposable" e-mail addresses. + +So don't let anyone enter a Mailinator address. + +_[Typing.]_ + +Right, but Mailinator.com doesn't have just one address. It has, like, 300. + +So get a list. + +There's no list actually. You have to go and reload the Mailinator page and +make a list and cross your fingers. + +Yeah, we looked at this. There's no list. + +Can we not rathole on Mailinator before we talk overall security? + +I mean, if we're counting on the library validation, is that good enough? No +one is going to enter a 500-page e-mail. + +Russians will. + +Very possibly. + +But we can set upload limits, right? + +Sort of, but we also allow people to upload large images for their profiles-up +to 2 megabytes. + +So? + +No, he's right. Those all come as a lump, so someone could enter a 500-page- +long e-mail, and we need to check it. + +I'll take that if you want, because it's going to relate to the overall +database schema. + +Can we catch it at the database? + +That's why I'll take it. + +Someone take a picture of the whiteboard? + +Sure. + +And we should talk about account expiration? + +Is that in the spec? + +No, but it's a dependency for the password-expiration admin tool. + +Who owns that? + +And on it goes, whiteboard after whiteboard, punctuated by the sound of a +mobile phone's fake camera shutter. "Do we need to keep track of how many +times they've been e-mailed?" "How do we remove e-mails once they're in the +system?" "What if someone enters the same e-mail twice?" + +Programmer A, the leader, seems very professional. She's at the whiteboard, +scribbling, erasing, scribbling, erasing. Lists, arrows, boxes, lines. She +wrote RUSSIANS? on the board. But after an hour you realize: This is just +e-mail. One field. One little bit of data. You haven't even hit names yet. +What if the user has one name? What if Bono or Cher signs up for an account? +What if it's the Chinese Bono? Do we want to allow sign-ups in Chinese? What +browsers do we need to support? Do the call center people need to be able to +manage accounts? + +It's hard not to think of barrels of cash burning. + +Programmer B is entering things into a tracking system, creating issues, +assigning tasks to people. A flurry of e-mailed assignments is emerging from +this meeting. Programmer C is young and annoying and very programmery, but the +others seem to like him well enough. + +How do we ensure that credit cards are valid, that physical addresses are +real? Will we perform financial transactions ourselves? Which external systems +will integrate with our systems? Who will get the sales reports? We didn't +talk about the mailing list software. We didn't talk about password length, +the number of letters and symbols necessary for passwords to be secure, or +whether our password strategy on this site will fit in with the overall +security profile of the company, which is the responsibility of a different +division. + +So this is the work. It goes on for days. + +It gets turned into specifications and user stories, then reviewed with +TMitTB, who right now is away at a conference (but tells you he's overjoyed +you attended this meeting). + +Not a line of code is written throughout this process. + +### 5.1 What Is the Relationship Between Code and Data? + +Data comes from everywhere. Sometimes it comes from third parties--Spotify +imports big piles of music files from record labels. Sometimes data is user- +created, like e-mails and tweets and Facebook posts and Word documents. +Sometimes the machines themselves create data, as with a Fitbit exercise +tracker or a Nest thermostat. When you work as a coder, you talk about data +all the time. When you create websites, you need to get data out of a database +and put them into a Web page. If you're Twitter, tweets are data. If you're +the IRS, tax returns are data, broken into fields. + +Data management is the problem that programming is supposed to solve. But of +course now that we have computers everywhere, we keep generating more data, +which requires more programming, and so forth. It's a hell of a problem with +no end in sight. This is why people in technology make so much money. Not only +do they sell infinitely reproducible nothings, but they sell so many of them +that they actually have to come up with new categories of infinitely +reproducible nothings just to handle what happened with the last batch. That's +how we ended up with "big data." I've been to big-data conferences and they +are packed. + +### 5.2 Where Does Data Live? + +It's rare that a large task is ever very far from a database. Amazon, Google, +Yahoo!, Netflix, Spotify--all have huge, powerful databases. + +The most prevalent is the relational database, using a language called SQL, +for Structured Query Language. Relational databases represent the world using +tables, which have rows and columns. SQL looks like this: + + + SELECT * FROM BOOKS WHERE ID = 294; + +Implying that there's a table called BOOKS and a row in that table, where a +book resides with an ID of 294. IDs are important in databases. Imagine a +bookstore database. It has a customer table that lists customers. It has a +books table that lists books. And it has a clever in-between table of +purchases with a row for every time a customer bought a book. 24 + +Congratulations! You just built Amazon! Of course, while we were trying to +build a bookstore, we actually built the death of bookstores--that seems to +happen a lot in the business. You set out to do something cool and end up +destroying lots of things that came before. + +Relational databases showed up in the 1970s and never left. There's Oracle, of +course. Microsoft has SQL Server; IBM has DB2. They all speak SQL and work in +a similar manner, with just enough differences to make it costly to switch. + +Oracle makes you pay thousands of dollars to use its commercial enterprise +database, but more and more of the world runs on free software databases such +as PostgreSQL and MySQL. There's even a tiny little database called SQLite +that's so small, so well-behaved, and so permissively licensed that it's now +in basically every smartphone, available to apps to help them save and load +data. You probably have a powerful SQL-driven database in your pocket right +now. + +### 5.3 The Language of White Collars + +If you walk up to some programmers and say, "Big corporate programming," +they'll think of Java. Go to any of the popular coding job sites, such as +dice.com, and search for openings in New York City--almost 2,000 results for +Java on a recent search; 1,195 for JavaScript; 930 for Python; 344 for Ruby. +Only two for Lisp. + +Java is a programming language that was born at Sun Microsystems (R.I.P.), the +product of a team led by a well-regarded programmer named James Gosling. It's +object-oriented, but it also looks a lot like C and C++, so for people who +understood those languages, it was fairly easy to pick up. It was conceived in +1991, eventually floating onto the Internet on a massive cloud of marketing in +1995, proclaimed as the answer to every woe that had ever beset programmers. +Java ran on every computer! Java would run right inside your Web browser, in +"applets" (soon called "crapplets"), and would probably take over the Web in +time. Java! It ran very slowly compared with more traditional languages such +as C. What was it for? Java! They also had network-connected computer +terminals called JavaStations. Java! Kleiner Perkins Caufield & Byers even +announced a $100 million Java fund in 1996. But after all that excitement, +Java sort of … hung out for a while. The future didn't look like Sun said it +would. + +Java running "inside" a Web browser, as a plug-in, never worked well. It was +slow and clunky, and when it loaded it felt like you were teetering on the +edge of disaster, a paranoia that was frequently validated when your browser +froze up and crashed. Java-enabled jewelry, meant to serve as a kind of +digital key/credit card/ID card, also had a low success rate. But Java was +free to download and designed to be useful for small and large teams alike. + +Here are some facts about Java to help you understand how it slowly took over +the world by the sheer power of being pretty good. + +![](images/sec2_ribbon.jpg) + +Photographer: Joanna Mcclure for Bloomberg Businessweek; Prop Stylist: Amy +Henry + +It was a big language. It came with a ton of code already there, the "class +library," which had all the classes and methods you'd need to talk to a +database, deal with complex documents, do mathematics, and talk to various +network services. There were a ton of classes in that library waiting to be +turned into objects and brought to life. + +It automatically generated documentation. This was huge. Everyone says code +deserves excellent documentation and documentation truly matters, but this is +a principle mostly proven in the breach. Now you could run a tool called +`javadoc`, and it would make you Web pages that listed all the classes and +methods. It was lousy documentation, but better than nothing and pretty easy +to enhance if you took the time to clean up your code. + +There were a lot of Java manuals, workshops and training seminars, and +certifications. Programmers can take classes and tests to be officially +certified in many technologies. Java programmers had an especially wide range +to choose from. + +It ran on a "virtual" machine, which meant that Java "ran everywhere," which +meant that you could run it on Windows, Mac, or Unix machines and it would +behave the same. It was an exceptionally well-engineered compromise. Which +made it perfect for big companies. As the 2000s kept going, Java became more +popular for application servers. Creating a content management system for a +nongovernmental organization with 2,000 employees? Java's fine. Connecting +tens of thousands of people in a company to one another? Java. Need to help +one bank talk to another bank every day at 5:01 p.m.? Java. Charts and +diagrams, big stacks of paper, five-year projects? Java. Not exciting, hardly +wearable, but very predictable. A language for building great big things for +great big places with great big teams. + +People complain, but it works. 25 + +### 5.4 Briefly on the Huge Subject of Microsoft + +Of course if you are Microsoft, this is intolerable. You can't have some other +company creeping into your banks and enterprises with this dumb language. You +can't have people choosing to run stuff on a virtual machine when they should +be running it on Windows machines, as God and Bill Gates intended. + +Microsoft Windows 95 Video Guide with Jennifer Aniston and Matthew Perry from +Friends + +Source: Youtube + +Don't ever count Microsoft out. Its great corporate skill has always been to +take the sheer weirdness of computer ideas and translate them for +corporations, in the language of Global Business Leadership. Whatever is +discussed in this issue, Microsoft offers at least one of it. Statically +typed, scripting, data-driven, functional--name your ambiguous adjective, and +Microsoft will sell something that delivers that to you, and you can write +Windows code in it and live a Windows life. And this is not disparagement; +Microsoft products can be as good as or better than anything else on the +market. + +### 5.5 Liquid Infrastructure + +"Enterprise" is a feared word among programmers, because enterprise +programming is a lot of work without much to show for it. Remember +healthcare.gov, the first version that was a total disaster? Perfect example +of enterprise coding. At the same time, programmers respect big systems--when +they work. We respect the ambition of huge heavy machines running big blobs of +code. We grew up reading about supercomputers. Big iron is cool, even if the +future seems to be huge cloud platforms hosting with tons of cheap computers. + +But Java is also in wide use at Google. It's a language for places such as +General Electric and Accenture. These aren't startups, but if their product +schedules slip, so does their revenue, and they are beholden to the public +markets. Gigantic data-driven organizations are structured around code, around +getting software made. But that doesn't mean their teams are huge--Amazon, for +example, is famous for its two-pizza rule: "Never have a meeting where two +pizzas couldn't feed the entire group." + +![](images/pizza.gif) ![](images/pizza.gif) + +These companies have cultures that know how to make software. They have whole +departments dedicated to testing. The process is important because there are +so many moving pieces, many of them invisible. + +Academic researchers often produce things that basically work but don't have +interfaces. They need to prove their theses, publish, and move on to the next +thing. People in the free software community often code to scratch an itch and +release that code into the digital commons so that other people can modify and +manipulate it. While more often than not this process goes nowhere, over time +some projects capture the imagination of others and become part of the +infrastructure of the world. + +Java, interestingly, profits from all this. It's designed for big corporate +projects and has the infrastructure to support them. It's also a useful +language for midsize tasks. So the libraries that you need to do things--image +processing, logging on to files, full-text search--keep appearing at a steady +clip, improving on the standard libraries or supplanting them entirely. + +Eventually, people realized that if they didn't like the Java language, they +could write other languages that compile to Java "bytecode" and run on the +Java virtual machine (JVM). So there are now many languages that run on top of +Java. Some are versions of well-known languages, such as Jython and JRuby. +Others are totally new, like Scala, which is one of the languages that Twitter +began to use when it outgrew Ruby. There's also Clojure, which is … a Lisp. +That is, Clojure takes a much-adored computer language that was born in the +1950s, updates it for the 2010s, and gives that language the ability to reuse +all the Java classes in the world. + +Clojure was created by Rich Hickey, who decided that he wanted a new, modern +version of Lisp. 26 Lisp may be old for a language, but it's still revered as +a classic model for thought, like a Braun shaver or an Eames chair for the +mind. Hickey worked on Clojure for many years, eventually adapting it to run +on the JVM. This was a dramatic choice, because it meant that Clojure had +access to the entirety of the Java class library. + +Now you walk into the office and sit at your computer and write a little Lisp- +ish code, very elegant and well-considered and trim and comfortable, but you +have access to thousands and thousands of incredibly well-thought-out and +totally functional free libraries that you can use to get your work done. + +Anything Java can do, Clojure can do. And since it's built atop the JVM, it +can do it on any computer. There were already Lisp editing tools out there, +and it was pretty easy to modify them for Clojure. It was joined to Java like +a remora to a shark. Or more accurately, it's a remora attached to a remora, +because the JVM itself is a fake machine running inside real machines. + +Clojure is beloved but not widely used. Perhaps it will become more popular. +It shows up in interesting places. It's used at Wal-Mart Stores to collect and +manage receipt data, for example. It was ported to the world of Microsoft and +runs right inside Excel. It's the craziest thing. Take a spreadsheet. Inside +the spreadsheet is some Clojure code just running away, addressing the +different cells and columns. Someone made a version that compiles (well, +transpiles) to JavaScript, so blam, Clojure's running in your Web browser. +Actually that version is called ClojureScript. + +The point is that things are fluid in the world of programming, fluid in a way +that other industries don't seem to be. Languages are liquid infrastructure. +You download a few programs and, whoa, suddenly you have a working Clojure +environment. Which is actually the Java Runtime Environment. You grab an old +PC that's outlived its usefulness, put Linux on it, and suddenly you have a +powerful Web server. Now you can participate in whole new cultures. There are +meetups, gatherings, conferences, blogs, and people chatting on Twitter. And +you are welcomed. They are glad for the new blood. + +Java was supposed to supplant C and run on smart jewelry. Now it runs +application servers, hosts Lisplike languages, and is the core language of the +Android operating system. 27 It runs on billions of things. It won. C and C++, +which it was designed to supplant, also won. A lot of things keep winning +because computers keep getting more plentiful. It's weird. + +### 5.6 Off the Shelf + +A few weeks later, when he's in the office and in for his meeting, you ask +TMitTB if there's a way to use more off-the-shelf components, a way to buy +your way out of this. + +#### _Sending an e-mail_ + +**If you need your JavaScript application to automatically send someone an e-mail, you might do something like:** + + 1. Google `npm e-mail;` + 2. Follow the first link; see that there's a very common module simply called "e-mail" that was downloaded 5,015 times a month; + 3. Type `npm install e-mail` from your command-line; + 4. Skim the Web page for the module looking for sample code; + 5. Copy and paste the code; + 6. Modify it a little; + 7. Run the code by typing `node myscript.js;` + 8. Stare in perplexity when nothing happens; + 9. Spend half a day or more configuring your mail server so it actually sends e-mail; + 10. Send yourself so much e-mail that your corporate network blocks you as spam; + 11. Give up on that for a day; + 12. Try to run the e-mail code the next day; + 13. Repeat the thousands of times with a familiar sense of dread; + 14. Once it works, check it into the code repository, send an e-mail to the team, and update the status of code in the issue tracker; + 15. Promise yourself that you will write documentation and tests tomorrow; + 16. Never write these things. + +He makes a face. Sort of, he says, but when you're making a system that will +integrate with the systems around it and your company is a set of such +systems, nothing is truly off the shelf. There are tools and packages and +libraries, and if you have any wit at all you already use well-documented, +free code for things such as e-mail validation, but that obviates only so +much. + +"Everything is edge cases," he says. "Testing and edge cases." + +You come to the conclusion: The world is broken. + +### 5.7 What About JavaScript? + +Remember Netscape, the first huge commercial Web browser? In 1995, as Java was +blooming, Netscape was resolving a problem. It displayed Web pages that were +not very lively. You could have a nice cartoon of a monkey on the Web page, +but there was no way to make the monkey dance when you moved over it with your +mouse. Figuring out how to make that happen was the job of a language +developer named Brendan Eich. He sat down and in a few weeks created a +language called JavaScript. + +JavaScript's relationship with Java is tenuous; the strongest bond between the +languages is the marketing linkage of their names. And the early history of +JavaScript was uninspiring. So the monkey could now dance. You could do things +to the cursor, make things blink when a mouse touched them. + +But as browsers proliferated and the Web grew from a document-delivery +platform into a software-delivery platform, JavaScript became, arguably, the +most widely deployed language runtime 28 in the world. If you wrote some +JavaScript code, you could run it wherever the Web was--everywhere. + +JavaScript puttered around for years in the wilderness, as Java did, too. But +without the resolute support of a corporate entity like Sun. + +Then, about a decade ago people began to talk about Ajax29--the idea that you +could build real software into a Web page, not just a document, but a program +that could do real work. + +Things could respond and change according to inputs. You could distribute your +software to hundreds of millions of people this way, and JavaScript would work +for them. It wasn't as controlled as Java, it was much slower than natively +compiled C, and it had a terrible lack of niceties. And yet: Gmail, Google +Maps, Flickr, Twitter, and Facebook. Every single pixel on a Web page can be +manipulated now; the type can be changed, the words can move around; buttons +can be pressed. + +As with any celebrity, there’s a whole industry dedicated to spackling up its +deficiencies and making it look good. There are books about the “good parts” +of JavaScript; there are libraries that make it easier and more consistent to +program, too, such as jQuery, which can turn the many lines of code necessary +to make a paragraph disappear into a single `$("p.optional").hide();`. + +Back in the era of the iPod and candy-colored Macintoshes, Apple took the code +of an open-source Web browser called Konqueror and modified it to create +Safari, its own Web browser to compete with Microsoft’s Internet Explorer. +Then in 2008 Google started to make its own modifications to the Web engine +underneath Safari, called Webkit, and made its own version called Chrome with +a ­spanking-fast JavaScript engine called V8. They made JavaScript fast. “Devs +still approach performance of JS code as if they are riding a horse cart,” +tweeted one developer, “but the horse had long been replaced with fusion +reactor.” Google does better when JavaScript is fast. + +In 2008 a developer named Ryan Dahl modified the V8 engine, which was free +software, and made it run outside the browser. There had been freestanding +versions of JavaScript before (including some that ran inside Java, natch), +but none so fast. He called this further fork Node.js, and it just took off. +One day, JavaScript ran inside Web pages. Then it broke out of its browser +prison. Now it could operate anywhere. It could touch your hard drive, send +e-mail, erase all your files. It was a real programming language now. And the +client … had become the server. + +Here's some JavaScript, squaring some numbers for you: + + + function squares(count) { + var x = []; + for (var i=1;i