Ask HN: HN people who write meaningful software, how did you learn to program?
The word 'meaningful' may be a bit ambiguous. It infact is. By 'meaningful' software I mean any software that has meaning to you or your customer. The thing is you deliver value in one way or the other.
E.g: You write and maintain an open-source package used by quite a few people. Or maybe you wrote and website as a hobby. Now, it is used by quite a few people so you maintain it and the revenue it generates is your primary source of income.
If the above description fits you, can you recall how you learned to program and build meaningful things? More importantly what drew you towards programming, and not another subject? And if possible, mention THE meaningful software you wrote.
75 comments
[ 4.9 ms ] story [ 170 ms ] threadAfter that I had many things to feel bad about from previous works and was motivated to do the next thing better, finding my own ways to improve it, not always hitting on the best way.
Then FOSS started up in earnest and I could work on and learn from sources like Linux, suddenly the areas I was lacking in could jump forward and my code was more than good enough for my own foss projects.
I have a liberally-licensed project used by a lot of people for a long time. But I can't find a way to make any money from it.
>Now, it is used by quite a few people so you maintain it and the revenue it generates is your primary source of income.
I kind of wish I knew how to do that. I have 2 fully functioning products but I have no idea how I go about trying to sell them and give random people access and support problems etc. All the while still holding a job so I can pay the bills.
>If the above description fits you, can you recall how you learned to program and build meaningful things? More importantly what drew you towards programming, and not another subject? And if possible, mention THE meaningful software you wrote.
So I went to college whose tagline was that you are already skilled sysadmin and you want to upgrade or refresh your skills. In reality it was a class full of people who vaguely knew how to type.
So in my boredom I bought a 'learn C programming' book and taught myself how to program. I had already known bash and dos pretty well. C# and .net probably would have been the better choice but they were new at the time and not linux compatible.
The awful syntax of C really damaged my software development track. Many years later I got into python and frankly I wish I had gotten into python forever before. Now I love programming.
So my 2 private projects. 1 is a honeypot network which produces a threat feed of ip address in txt and stix output. Pretty much all the usual nextgen firewalls can ingest and block traffic.
The other is an NCM built with django. If pulls configs off the usual networking devices but also effectively runs a report to tell you what rules you are breaking in the security hardening guide.
But the bulk of it, IMO, was just reading books (Teach Yourself C by Herbert Schildt was were it all really started for me) and working through the exercises. So hours and hours and hours of firing up Turbo C++ and going through the exercises in that book, and then later others. I majored in Computer Science at UNC-W (but dropped out before graduating) and that is where I was exposed to the Deitel & Deitel books, and after that I spent a lot of time reading and doing exercises in C:How to Program, C++:How to Program, and Java:How to Program by Deitel & Deitel.
There was more formal schooling that came after that era, but I look at the bulk of my programming education as being all that reading and coding I did back in the late 90's and very early 2000's.
That said, I'm still learning even now, so the story hasn't been fully told just yet. Maybe we get one of those Matrix style direct neural interface things, so I can "jack in" and experience a "Prolog? I'm going to learn Prolog??" moment before it's all said and done.
I've always enjoyed learning and coding, especially when I was in college. I remember in High School I learned about VB in Word and fell in love with how fun it was (not the language). That sealed me in and during college I would learn and code for fun, rather than do the homework assignments. I've always really loved it.
I've learned from watching youtube, reading articles, reading pull requests in software I liked or used, and just doing it. For the project above, I did it in Angular, something I already learned from work and C#, something I had touched a bit in college but due to the cross platform (.net 5), i picked it up as something to learn. Bought 1 course on Udemy, watched half of it and started coding. It was always a program to meet my needs but the lack of competition made me release it and grow with the communities needs as well.
For anyone interested: https://github.com/Kareadita/Kavita
Started out with posting some initial charts on twitter in 2021 which got good feedback and it grew from there. Hanging out in art circles helps a lot btw for questioning what is 'meaningful'.
Later, I moved on to Amos on the Amiga and then C (Turbo C on DOS at first) on the PC during middle school/high school. The web came along at some point during this and I started in on Perl and HTML.
Got a proper CS education at college :) and after graduating went into the Army for 4 years (this was back in 2002).
After that, got into the aerospace/defense industry doing C++ and Ada. Later, moved over to more IC-flavored work mostly in Java, with some Scala and Clojure mixed in.
These days, I'm out of government work doing Clojure all day in fintech.
Still learning to program. The meaningfulness of my work has varied over the years :)
I've tried to spin up various side projects (both open source and not) but have not been very successful at creating anything with staying power.
I started to become interested in how computers where working when I was ~12, mainly driven by boredom. I didn't know how anything worked of course, but somehow was determined to create my own website, and struggled my way into HTML and free FTP/WWW hosting through various Swedish computer forums and guides. From there I added to my knowledge step by step, I learned CSS to make my sites less ugly, then PHP to be able to "log in", then SQL/MySQL to be able to create a "guestbook", and then some JavaScript, etc etc etc.
After a few years of spending all free time at the computer, I got my first job/internship when I was 14.
During my first 6 years or so as a "programmer", I don't think that I ever considered reading a book on any of the topics. I just went at it, and copy-pasted and brute-forced my way forward until things started to "click" in my head.
I very vividly remember a moment when I realised that I suddenly knew how to create a website that would look exactly the way I wanted, from scratch!
I was building things purely for fun, and started new projects seemingly every weekend. But I kept shipping, and somehow absorbed more and more knowledge.
These days I might read a book/paper/documentation to learn about a new topic, but brute-forcing/learning-by-doing is still my favourite way to learn.
I was a child, and computers were fascinating. I wanted to learn everything about them. When someone showed me that I could write a program of my own, that I could make the computer do what I wanted it to - that was it. I dug into programming just as hard as I see some kids now dig into video games, and I kept that exploration up for decades.
Much of my career I've spent trying to pass along something like that formative experience: in various ways, building tools which empower people to take greater control of their own computers.
So I took up to download darkbasic (and after that darkBasic Pro).
That's how I've learnt programming. Just as a way to create things. That's definitely a driver for me, the ability to create and put my taste and imagination into things.
(I've also learnt to produce music along with sound engineering a few years later, for instance)
How did I learn? Started coding in college, about as mundane a start as you’ll hear, but it does kinda prove my point that meaning and work can be very detached from eachother.
A quick 1-liner Stack Overflow answer that addresses a common typo is my highest rated answer. Those that I spent hours (or maybe even days!) answering: almost nothing.
2. CSV parsers are easy to write
I know I know, someone once said it was hard, everyone else wanted to be smart and started reporting it.
What CSV is, is ambiguous. But if you're ingesting CSV generated by the export function of a tool, that's not ambiguous.
Usually I want CSV, it is because I'm playing around with data on the command line and doing grep/cut/and so on. If I has something that output json... that miller tool is supposed to be good for this sort of stuff I think. https://miller.readthedocs.io/en/latest/
By 11 or so, I became fascinated with AOL 'proggies' and picked up Visual Basic. Made a few of those. Ended up writing a keylogger on commission that I believe partly led to a man's murder. Story for another day.
After that I lost interest in programming with typical teen stuff, didn't really even use a computer much until later...I guess 21 or 22. Hired to do menial data entry tasks, and decided to automate my way out of it. Next job, same thing. Decided to read a few Python books instead of just Googling as I go as I did as a kid.
Over the years since, it's mainly just been picking up things as I need them or they interest me. Learned enough C to work on an open source library. Learned Go because Python deployments were annoying(among other things), and so on.
Story for today, please?
Mom used to have an AOL buddy she always talked to. Di57 was her screen name, and what she called her when talking to us about her. They were about the same age, both married, had kids, etc, so a lot in common. They'd talked for at least a couple years, I guess.
One day the lady asked her if I could write something to see what her family was chatting about... in the guise of 'protecting my family' and nothing more. We figured it was probably about the kids. I forgot what she paid me, $20 or $50. So what I wrote wasn't actually a keylogger, but used win APIs to grab text from IM windows, and store that. Didn't know how to really hide it or piggyback it, so just gave it a name like 'win32xxx' something or other, hell it's been more than 20 years now.
Didn't think much of it really, one day Di57 told my mom her husband was cheating on her with multiple women, telling some his wife was dead, some he wasn't married, some they were separated etc etc. Sad news. They kinda didn't chat much after that.
This is where I get fuzzy because I don't remember exact timelines, but at some point not immediately... I'd guess 4 to 16 months later, her husband died. She was convicted of his murder, and apparently it became a big thing because of cold case or snapped or something or other(I hate those shows). Her name was Diane Fleming...in prison still AFAIK.
I don't say this to brag, or feel any guilt or anything. Just something that always sat in the back of my mind -if- things would have been different if I hadn't done that.
Some of these details and timelines may be off, I guess I never really thought about it much recently. For some reason, I remember us both thinking she was guilty, I think there may have been other pieces of things she'd said I'm forgetting.
She would have found out some other way and probably with the same result.
Sorry, but searching for 'methanol poisoning' one month before your husband dies of methanol poisoning, is a terrible coincidence at the very best. Then trying to hide the hard drive when the police start asking questions is...guilt.
Whenever I see something like this I remember the batch script I helped someone write that I later learned assisted in his suicide.
I guess it was meaningful software, but he would have done it anyway.
Anyway, I learned BASIC from reading books & magazines. Went on to write a lot of shell scripts, FORTRAN and BASIC programs in college. Started learning C around graduation and continued onward...
I've now been doing it for a couple more decades... and I'm still learning. Learning to code is not something to learn and then do. It is something you learn continually for your entire career.
The above was the start/spark, but actually learning to write commercially useful code came from, well, working writing commercially useful code at a series of startups and small companies.
The specific area that I work/worked in isn’t that important to the question IMO. It’s had a wide range spanning from gaming to hedge fund to computer languages to business services. (Gaming paid the worst but taught me the most per year.)
I started learning how computers work back in the 80s/90s because we were poor and I had to hack my computers to work with the games I wanted to play. So I'm running Doom on a POS 386 and have to hack/tweak everything from DOS to the modem init string when playing over TCP/IP. I had started to learn batch scripting and some QBASIC around that time as well. I learned QBASIC because I wanted to create my own "snake" game and eventually my own RPG.
When I was around 10, I went to "bring your kid to work" day for a friend of my dad. He was a programmer who wrote C/C++. He gave me a copy of Borland Visual C++ and a book. I started learning what I could but it was silly console stuff. Eventually the web came out with HTML and Javascript v1 and I started creating my own web pages for myself and for random businesses like my local church and some friends. By the time I was 16 I got a kick-ass job programming and doing IT stuff for the American Military University, coding in Visual Basic, Visual C++, Java, and other random stuff. Skipped college because I got an offer from a major defense contractor making great money for a 18 year old. Now I'm on track to be CTO within a division at a major company (I'm 40 years old).
I started out in my mid-30s when I went back to school for Applied Math, originally intending to try for the Army's ORSA program, as Applied Math for most of the past 50 years has inevitably involved a lot of computer programming, then simultaneously discovered I liked programming even more than I liked math, and I wasn't going to be able to stay in the Army thanks to spinal degeneration, so switched to Computer Science.
That said, I'm still largely self-taught anyway. School only goes so far, and most courses expect you to come in already knowing how to do the basics. That involved the same steps to learn anything else, lots and lots of practice. Some books, mostly the C/C++ classics by K&R and Stroustrup, some supplemental courses on specific applications and technology stacks I found in Coursera, and ultimately making my own toy Linux distro with its own package manager and configuration management system after going through Linux From Scratch a bunch of times and getting tired of all the manual steps.
Really, though, how to make anything "meaningful" was mostly learned on the job. Other than I guess tiny utilities that are part of a standard GNU or BSD system, there isn't a whole lot of meaningful software written by one person. Most of it exists for decades and is worked on by hundreds of people who may not even be alive at the same time. Unless you're contributing to some really big OSS project like Linux or Kubernetes, it's hard to get that kind of experience outside of being employed.
That's probably largely due to language choice, though. C and C++ are very mature languages that have been around a long time. No matter what you might want to do with them, chances are a library that provides the bulk of the building blocks you need already exists, thanks to the GNU project, libc specification, OpenSSL, curl, Boost, QuantLib, Armadillo, so many decades of prior work and the fact they've been the major working languages used in universities and research labs. Developers coming up in the JavaScript and Rust ecosystems these days face a more greenfield world where the opportunity to make smaller reusable components still exists, plus the web is inherently a less stable platform than OS APIs, and both of those are less stable than implementing math algorithms that have been known for centuries, so the situation is different there.
I've learned quite a lot of theory at college, but I've learned the most by just writing code on my job. I've had quite a lot of independence and ownership of my code - complete freedom to do whatever I want to make it work - in the first ~2 years, so I've written and re-written my software every time I found that I've coded myself in the corner. After a while, I started to see patterns of which ideas work well and which don't, my understanding of programming in general has deepened a lot, and I've become able to write just about any random web-service in a reasonable amount of time.
In a nutshell: just write code.
Like many, I'm self-taught and learned to program before formally studying CS in college. I found my dad's copy of the K&R C book and would sneak into my parent's bedroom at night to write code on the family computer (he was jaded from his career and didn't want me to become a coder). I'd debug during the day in school. I found more programming books at the library and learned more languages that way. I mostly learned by building little projects constantly.
Curiosity is what drew me to programming. There was an endless supply of interesting problems to think about and I wanted to figure out how things worked--no different from a budding civil or electrical or mechanical engineer wondering how the infrastructure surrounding them worked. The big difference, I think, is that software is considerably more accessible as a young child than, say, building a bridge or building or robot.
I wrote CGI scripts in Perl for paying customers in the late 1990s, then was lucky enough to move into a small company with some top-notch programmers who taught me to write more reliable, maintainable code.
The best lessons I learned early in my career came from having to maintain my own code in production for years on end. You learn not to cut corners and to avoid convenient hacks when you have to maintain the code. You take the long view in your design, aiming to prevent problems you now know how to anticipate. You seek and implement best practices, because dealing with problems in live systems is no fun at all.
There's an old saying: Always code as if the person who will maintain your code is a violent psychopath who knows where you live. When that person is you, you learn your lessons.
The systems I wrote early on helped researches run studies on human subjects. Later systems helped digital archivists preserve materials at multi-terabyte scale.
Kpow is a toolkit for Apache Kafka, so basically we build an expert system for experts - it's a lot of fun. We are very, very delivery focused. The idea came from my own experience through the past 10 years building things with Kafka.
I like to think I'm a fairly effective programmer. The biggest shift in my productivity came 15 years into my career when I moved from Java to Clojure for delivery. It's not for everyone, but it certainly changed my world.
If I am a good programmer it's because I started to copy my older brother who was interested in programming back in the 80's when we had a Spectrum 48k and I just didn't stop.
Since the age of 6 I have written or read programs almost continuously except for the period between about 10-18 where I played games and hung out with friends instead.
At times I have been a terrible programmer, particularly when encountering a new languages and exploring ideas. That doesn't bother me because I know in time I absorb details, accumulate, and polish my own ability to delivery.
Behind it all though I enjoy programming and have stuck with it. I think that's the main thing. It takes time. I don't believe there are any shortcuts.
Keep challenging yourself, don't sit on the thought that 'My Language Is The Best', that's the respite for programmers who have stopped. You're only as good as your last three years so basically ignore any boomers on the net with opinions.
The best programmers I've worked with don't have blogs, don't write books, don't speak at conferences. They're too busy creating things, often quietly, often in not particularly glamorous settings.
It may be apocryphal but supposedly Steven King says the best way to be a good author is to read and write a lot of books, I think that applies to programming.
How did I learn to program? I learned how to write code starting in second grade, learned how to write production code as a member of team in my first couple of real world jobs.
How did I learn how to build 'meaningful' things? Beyond coding skills, I had to learn how to communicate effectively with people. I had to learn how to present my ideas in group settings, I had to learn how to listen to folks when they talked about their needs and wants, and how to dig in and really understand what was needed, coding-wise, to meet their actual real use cases.
```
interface IBackend {
}```
So I open source my work [2] as a result of that thought experiment. Almost 7k github star later, there's about 40k users who use my tool every month to access their FTP server, SFTP server, S3, WebdAV and more protocols and was contacted by people in places I would have never dream like NASA and MIT.
That project is a few order of magnitude more impact full than anything I've done in my professional life and I'm super excited to the prospect of developing the idea further as file manager are an amazing abstraction. My mum can navigate through folders and click on files but I would have a hard to time to explain her what a tree is and a lot of complex system can be model as simple file managers. A good example which was implemented in Filestash [3] is a relational database, the db can be modeled as different folders, tables as subfolders and rows as file which can be edited and save back which would under the hood simply generate a bunch of sql queries
There's still a lot to do but at this stage, it doesn't make enough money to make it a full time job yet.
I learned how to code from a massive rabbit hole that started in high school while trying to make myspace pages look nice
[1] https://news.ycombinator.com/item?id=8863
[2] https://github.com/mickael-kerjean/filestash
[3] https://github.com/mickael-kerjean/filestash/blob/master/ser...
[1] http://zxnext.narod.ru/manuals/Basic_Programming.pdf