The Biggest Difference Between Coding Today and When I Started in the 80s
thecodist.com
thecodist.com
One problem with today's coding environment from an enjoyment perspective is that if something is fun, it will probably be written and packaged into a library. Data structures, algorithms, visualization libraries, abstractions on top of OpenGL, mathematical functions, data stores, neural networks, etc. -- all these things are great fun to actually try to write, and all of these things already exist in better forms than we'll ever write as individuals. Sometimes practical programming today feels more like gluing everybody's fun code together with your not-so-fun code.
Programming when I was growing up: https://www.toysperiod.com/images/lego-parts.jpg
Programming now: http://www.toysrus.com/graphics/product_images/pTRU1-1912094...
I see SOOO many people making AMAZING things gluing stuff together. Maybe they're gluing together three.js with WebVR. Maybe they're gluing together the JS Magic Leap support with a Kintec and an arduino. I see artists making art throwing together Unity with a few plugins for networking etc.
Sound way WAY more fun than me writing
10 moveto rand(320), rand(240)
20 lineto rand(300), rand(240)
30 goto 10
If you like writing the low-level stuff that's great. Knock yourself out. Me, I want to move on to the bigger stuff. Some people like to build cameras, Others just like to use cameras to make movies. I'd prefer the later (but I'm glad someone likes to make the cameras so I don't have to)I don't however understand what "three.js" is or what "JS Magic Leap" or... well let's just say I couldn't understand what any of those thing you say are SOOO AMAZING.
Of course they might be amazing, I wouldn't know. But it has the smell of breathless chearleading.
Sometimes libraries and frameworks make our lives easier. I'm glad the tools exist. I had much more fun writing all the little systems that go into a working WebGL app, and working with WebGL API directly, than using any of the popular libraries. But good luck teaching any meaningful amount of WebGL to a group of students who don't even know what HTML stands for without a library like three.js
Yes, seriously. Artists are great. I'm not an artist. Unity bores me; it sounds more fun to homebrew an engine and build on top of that.
People don't write code for free because it's boring. Open Source is all about making something cool. No surprise that cool code gets packaged in an OSS library.
- dll broken from MS. This happened to me. I did a lot of sleuthing, taking things apart, and it just didn't make sense. It was for a DB adapter, so the official documents would have been enormous. And unfruitful to read. In the end I got a hotfix from MS.
- Sort algorithm broken in Swift. Another one of those jobs where you take apart everything, because you assume it was your use of it, not Apple's library. Did a workaround after I got someone on SO to confirm it wasn't just me.
- Any number of little things that are unfindable in a manual. Heck, how often do you even look at a manual rather than an example?
- Learning issues. When you're new to a language, you don't necessarily know what you don't know. So being on an island with a manual is going to lead to you dying. Witness the many calls for help on SO from people with score 1. They don't know what's wrong with their code, and they don't know how to ask. Sometimes someone with have mercy on them and help, because it's normally something quite trivial. I remember being 15 and trying to learn c++. It was hard, because every little error you get is cryptic.
- You can make so much more with so much less now. There's a library for just about everything you can think of. The coder is mostly a chef who mixes existing ingredients. This means you can explore writing things that you'd never have time for otherwise. For example I did some web and mobile side projects beside my financial c++ coding. Always good with a breath of fresh air.
I really want to believe you, but I can't find any information on this, what are you referring to?
I agree with most of this article, but with one big difference: I still really enjoy programming, professionally and personally. (And maybe I'm over-stating the authors lack of enjoyment today.)
Back in the beginning, for me, there was the thrill of discovery, in a rather low-level sort of way. My first functional, written from scratch in BASIC program was enormously exciting. A couple of years later, as frustrations with the poor performance of a truly interpreted language pushed me toward learning a faster way, the same thrill was felt when my first machine language program started working. And then again with my first C program for the Amiga.
35 years later, I ask Google questions throughout day, every day, while I'm programming.
Sometimes I of think of it as a compiler for an optimized but very high level language. I rarely have to sweat the details, and when I come across a very powerful and clever solution (typically from Google), it doesn't really mean much to me, because I didn't 'earn' it. And I may or may not remember it in any detail, so I'll probably end up finding it again later.
But gcc does that same kind of thing, right? It converts C++ code into a highly optimized executable using all kinds of tricks that you probably don't know about, and that you very rarely need to explore. (Not never, though, given that every abstraction leaks over a long enough time period.)
The thrill I get today is from higher level and more abstract 'data and design things'. As one example, powerful and novel ways distributed systems can work together.
I'm intentionally leaving unaddressed a lot of the other interest, meaty things in the article, because nostalgia got the better of me.
Same here, but whenever I embark on a new project today I remind myself of this mantra: "Do not reinvent the wheel" Someone out there has probably already solved your problem, so why not speed up the process and use the fruit of their brain power as a tool to speed up your process? Carpenters or mechanics do not invent a new type of hammer or drill every time they embark on a new project. Why should we?
it's not woodworking anymore, it's glueing and google-fu to find the best patterns on cncoverflow, together with maybe some shim-building here and there and making your own custom stain
I guess it's a question of what is done with newly available, powerful tools and abstractions.
These days I sometimes compile rather than looking up the correct syntax for something.
Fast cycles changes everything. When you don't get up for a cup of coffee during compiles you program differently, learn about your code differently and can think abiout high level design more
The school swapped out the IBM 360 for a VAX a year or two later.
For example, I needed to do some UI but back then I hadn't the money to buy a toolkit (Windows was still some years away). Therefore I had to spend much time on making a UI and that UI was just a small concern to me.
Today, I have an idea for a program, then I gather all the libs I can to progress as fast as possible and I just need to code the missing/most important bits.
That is, I can concentrate on what's really important and leave plenty of the 80-other-percent to the open source community...
The pre-internet Amiga had a thriving public domain and shareware scene where volunteers would advertise in the magazines and you could pick and choose apps/demos/games for the price of postage and a floppy disk. But it was all binary, no source, and I don't remember any libraries ever being distributed that way. Maybe dev tools were too fragmented for that to be practical.
Today there is the idea that being the one person who knows more about a piece of code than the rest of humanity combined is a thing of value by itself and that this does not require protection. Letting your code free won't take that away from you, at least not as long as you care. I guess that idea just wasn't part of the mindset of that age.
Good point, and maybe this genuinely wasn't true back then. It would have been much easier to pass someone else's code off as your own back before Google and Github and GrepCode and so on.
" We use Heroku for hosting, and run automated tests on CircleCI. Slack bots report what’s being deployed.
There are a lot of external services we rely on heavily. To run through them briefly: Help Scout and Dyn for emails; Talkdesk and Twilio for calls and customer service; HelloSign for online contract signing; New Relic and Papertrail for system monitoring; Sentry for error reporting.
For analytics, we’ve used a lot of tools: Mixpanel for the web, Amplitude for mobile, Heap for retroactive event tracking. We mainly use Looker for digging into that data and making dashboards."
[1] https://stackshare.io/opendoor/the-stack-that-helped-opendoo...
Nowadays you think and integrate more, find which pieces fits in which one. You do program, of course, but just to glue those pieces together.
Sometimes, when you came from programing microcontrollers and so on, you might miss that you had control of every single bit of what was happening. You just rely that some package will deliver you what it says.
I suppose that's one reason why creating a startup is so attractive to software developers; it's a means by which productivity improvements work for them by allowing them keep more of the wealth they create, instead of against them by setting a higher and higher productivity bar that must be met each year just to keep the same job.
The worst part for me is that my library had a computer section, but it was filled with stuff like "FORTRAN for System/360". Apparently the library decided that they had enough computer books and didn't bother getting new ones.
In one of the videos he said that he doesn't use the internet at work. Hates it. When he has a question, he writes it down. When he needs to learn something, he googles it at home, downloads a bunch of articles as PDFs, then goes through them at work, but offline.
You used to follow the program all the way through on your local machine and interrogate all the variables.
Now, you're debugging across the client and the server. I think that is one of the reason unit testing has taken off. It is much harder to know where something happened.
The third biggest difference is that languages can be a lot more complicated because documentation is searchable so you can have a lot of functions that do the things you might have written yourself.
First, programming was sooo much slower. Nowadays there's a function or a library for everything. Back then, if you wanted to serialize something to disk, you had to write a serialization function first. Fun, but SLOW.
And secondly, debugging was even moooore slower. The amount of time wasted on trial and error was astounding. Nowadays, if a library or browser or OS is misbehaving, a quick search will usually find the problem and workaround options. Back then, it could easily take days and days to try different solutions (hence the "invention" and "creativity") until one turned out to work, and it might not ever work at all.
So while the author says:
> I have to admit I think programming was actually more fun back then. Without all the modern trappings of working as a programmer that suck major time out of your day we were able to spend a majority of every day actually programming.
What I remember is a majority of every day spent debugging mysterious problems with OS calls and libraries, or writing "grunt" algorithm code for stuff there ought to be a function for already, as opposed to writing the fun new stuff. And let's not even talk about waiting minutes to recompile, or how primitive debugging tools were back then.
Ah. Not everyone had same experiences. Being Windows programmer was total hell in the 80's and 90's. OS API was battleground for Microsoft. They introduced all kinds of things to break competing software.
What I really love in programming is the flow and focus you can attain when coding for hours with little interruption when you master all the libraries you use. You feel how everything quiets down around you, not because there is less noise, but because your concentration is so strong that they fade away. When you stop and go outside it feels like you have been on long trip in a faraway place. You look at people and they are acting just like before you left but you feel like foreigner. When you go to sleep you have weird dreams where you move in some data structure.
http://catb.org/~esr/jargon/html/H/hack-mode.html
edit: I don't think its fundamentally low level vs. high level problem. It's the quality of api/library problem. Compact and logical high level library that you can understand and master without continuous stream of surprises is what is needed. Verbose libraries with unnecessary "enterprise" cruft kill the hacker inside me.
As a side note, I'm one of the creators of a tool called Sourcegraph (https://sourcegraph.com) and this post actually captures a big part of the problem we're trying to solve. Being able to jump to def and find references / usage examples across open source makes reading / understanding / grokking code a lot more fun and efficient. Would love to hear people's thoughts.
My first programming job - our product was a CAD package for Windows 2.1 and the new v3.0 beta. It took 9 hours to do a full recompile on our fastest computer, a fancy new 486dx-33 with 8MB of RAM!
NINE HOURS TO COMPILE.
Now I get impatient if it takes more than 15 seconds to compile, build the firmware image, download it to hardware and reboot.
It's a different world, for sure.
I think it makes us a little careless. The approach to coding is different. THEN there was a huge penalty to break the build, and we tended to think through a solution very carefully before implementing it. Now, I'll confess, I'm just as likely to plug in some magic numbers and see what happens, or set a breakpoint down in the guts of some heavy code and see what's happening as I am to very carefully think through all the permutations and be sure of everything before hitting Go.
In the real world, 99% of people just pick 1 stack and get on with their lives.
Fast forward to let's say the early 1900s, and people have figured out how to automate and mass-produce barrels very efficiently, such that there's really nothing much to it anymore. It becomes a question of your materials-sourcing abilities. One person can make lots more barrels a lot more easily, and do it better than you can. Because of this, most people just buy a barrel when they need one; they don't make them by hand anymore.
Then: memory and CPU cycles were not cheap
Now: everything is multithreaded and often asynchronous
Early 90's. The young teenager pilfers another Turbo-C demo disk from a thick book on the discount table at the back of the bookstore. His last demo ran out of time and he can't continue work on his game without it. He can't afford the software license. He logs onto the local BBS when he gets home and reads about something called, 'Mode-X'. Mind blown.
Late 90's. He drops out of high school to write Perl for a living. He makes a bigger salary than either of his parents ever did. More than his peers who were flipping burgers for minimum wage. He writes scripts to generate a website from his journal log files and shares it with his, "other friends." The ones who know the right incantations to make computers do things beyond playing video games or listening to music.
I wasn't a professional programmer at the time by a long stretch but I do remember having to figure most things out for myself. I caught the tail-end of the mid-80's craze to teach every kid how to program in BASIC. As a lone geek in astronomy club and pilfering his fathers' textbooks on classical mechanics I knew that computers were for programming and that was how you made computer games. I don't think I would've understood trigonometry or linear algebra any other way.
It's amazing how much the Internet has changed absolutely everything. Somewhere between 1999 - 2007 when persistent, high-speed access became the new normal programming changed. CPAN was a big deal and a huge tool... that idea caught on like wildfire. Now every language has a package manager and you can hardly start getting anything done without downloading a hundred or so megabytes of source code first. Learning has changed completely. We forget as easily as we discover since the knowledge is persisted for us. Learning about Duff's Device was a huge step for me... now I work with programmers who don't even know what the size of an integer is (a silly question of course... but totally unaware of how such a construct is implemented in the machine) and they do great work and provide immense value. Yet they couldn't construct a binary tree or heap if they needed to; the default is to, "just google it."
Yet when push-comes-to-shove I still find that sometimes forgetting all of that lets you get real, productive work done. Analysis, paralysis is a real problem in the face of an abundance of choice. Especially when there's not a clear "match" to your requirements. Sometimes it's just easier to solve the problem with your own solution that fits your use case.
So much of programming these days is glue code, even with IOT, devices and sdk's and libs are getting better and better.
The creativity of today comes from ingenious ways of developing new processes the arise from gluing together existing ones.
If you want to be doing greenfield algos go get a PHD in comp sci...and stay at the uni.
"...and the real skill is in finding it, relating it to what you need, deciding if it is useful or adaptable, and if it is of a decent quality"
SO posts should come with unit tests and library version manifests.
It would be a lot more representative of today's work if you were asked: given these 3 github repos with packages that all purport to do X, which one would you pick for this set of requirements and why? and how long would it take you and a team of 3 to get it done? Then you have an hour sitting next to the interviewer that can see what you are looking at in the code, what you are googling, how you are estimating and so on.
You could be the best algorithm writer in the whole world, but these days when do you ever have the luxury to write greenfield code? It's all "let's leverage open source" and "we don't have the budget to write our own frameworks" and "why do you want to spend X months writing this, when I googled and in 5 minutes I found 8 packages that do it" and "estimate how long it would take you to do <insert fuzzily defined huge task>" etc. etc. etc.
Personally I do miss the days where I felt that all I did was coding, as opposed to putting together a collage with code found elsewhere.
I sometimes feel like doing an Ask HN about "how do you find a coding job where you actually code most of the day when you are 20 years into your career"
Especially outside of full software companies, the ability to evaluate business processes as well as digitizing them is simply invaluable, and you'll almost never need to write your own x anyway.
Really it is better if "product owners" (or whatever) could actually do their job and talk to clients to distil out requirements that are clear and achievable. After that, the kind of programmer right for the job depends on, well, the job.
In embedded, desktop, games and a ton of other disciplines, there is lots of old school and fun dev and a minimal amount of CRUD boilerplate.
True, and reciprocally, it is terrible if you hate it. Back to the world of having no debugger, zero tool, potentially no auto completion and unable to do a print.
I still remember an old embedded IDE, when I scrolled down or up with the mouse, the code sometimes becomes a screen of garbage. It's not a display bug, if you save the file, it really become garbage of random characters :D
But yeah, if that's not what gets you going, then embedded work is not for you.
I hear you saying "well, that's your fault you keep working at those companies" - and that's not too far from the truth.
I play this game with my students on the second day of class, along with "read all these people fighting on StackOverflow and tell me the answer you have the most faith in." They split 50/50 between terrified and super pumped about how much trust they'll be putting in Random Internet Code.
There was also a plugin that would allow you to directly grab code from stack overflow and put it right into your project, kinda of like a search engine for laziness (I think it was an Atom plugin)
An implementation is here https://gkoberger.github.io/stacksort/
Find a company who requires any non-approved outside code, no matter how well known and even if using an already approved license, to go through a multi-month approval process that is almost always longer than the current project's allotted timeline.
As it is, if I need a red black tree, and if it isn't in any approved libraries, it is faster for me to write it myself.
That process being enforced will ensure that most code is buggy and development is totally unproductive. That will usually create an environment where noone expect anything from developers and you have zero accountability.
if it all goes well, you can toy around all day and not have to ship anything, still getting a paycheck, and not risking the comparison to your peers.
I don't think I'm following you. The procurement process is quite different than our coding process which involves team reviews and the like. Yes, productivity isn't as high as it could be because we sometimes have to develop something in house instead of using open source code, but we still have code review, unit testing, and similar required.
Hardly ever happens.
A lot of times, if I'm looking at some random github repo out there and its dependencies aren't apt-gettable or pippable or npmable, I just say "screw it" and write it from the ground up using only things that are apt-gettable, pippable, or npmable.
Except OpenCV 3.1. I'm willing to deal with that one. But I have a script to install it that's 55 lines long. (How ridiculous is that -- we need 55 lines of code to install things these days. Can't we just tell our computers to install stuff and aggressively figure out how to install it, no questions asked?)
That was because everybody was writing their own stuff instead of relying on frameworks that handle fuzzy things like user input for you. Many webpages have gotten more secure, but no without a cost for creative programmers everywhere.
I am not saying write everything from scratch. Just use only the stuff you have to.
But if you are skilled, you can easily produce code equivalent or better than the average framework out there. And it will likely be simpler because you're only coding for your own use case and not every case that exists.
Like wise we brought in Gino-F to plot results nicely