Ask HN: HN people who write meaningful software, how did you learn to program?

74 points by curious16 ↗ HN
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 ] thread
I learned to code before the Internet so there was a very small amount of examples and I had to trial and error the rest. My first code was bad quality, but it did work.

After 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.

I have 42 github stars, I suspect that's not impressive but perhaps meaningful enough.

>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.

That's a complicated question to answer. My "learning to program" over the years has been a mixture of self education from books, formal education, on the job training, reading OSS code, attending conferences, attending user group meetings, watching Youtube videos, etc., etc.

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 build open source software, I have one project with nearly 2k stars. It is a product itself and used by thousands of people. I do this while also holding a job as open source doesn't pay (although I do have donations).

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

Meaning-making is quite an ambiguous thing and mostly in the eye of the beholder. Taking that as a starting point I basically follow what others are responding to which led me to building tools, data analysis and writing articles for the digital/generative art community experimenting with blockchain on the https://thestackreport.xyz.

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'.

I started with BASIC out of books and magazines on an Apple ][e when I was in 3rd grade. My mother was (still is, actually) a software engineer in the aerospace industry so I had a lot of help getting started.

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've been building a lots of what's hopefully "meaningful" software for over 10 years now, at startups (others startups, and now my own), for open-source (zegl/kube-score being my most popular OSS creation), and large enterprises.

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.

While I have never managed to create any software as meaningful as the level I hoped my career would reach, writing code has after all given me a lifelong career, so the things I've made must have meant something to someone.

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.

I've learnt to code first year of junior high school, after I had started playing one of the first online MMORPGs (The Fourth Coming) and wanted to create my own.

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)

An important lesson I learned is that meaning and complexity are rarely linked. The most profitable code I wrote for a company took under a week and truthfully any mid-tier web developer could have done it. The code with the largest reach (millions upon millions of people) was an afternoon script. I’ve lately come up with a term for meaningful code: Friday Features. Little things you do on a Friday afternoon that have an outsized impact. Meanwhile a project I worked on for months didn’t move the needle at all.

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.

I can vouch for this. Major project that took months of my time and effort? Seemingly little impact; sometimes I question where it was just management trying to keep me busy. Minor feature added to a tool as a side project? Seems like every damn person in the company, and all of our customers, use it on a daily basis. Funny how these things work out.
I have a very minor example of something similar myself:

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.

Sad to say I'm in a similar boat. My highest rated answer explains how to do a callback. I just happened to be first, and correct. 11 years later it still makes me points.
By the way, "Export to CSV" is the most meaningful feature you can add to any project, regardless of purpose.
I've found JSON is extremely useful in command line tools, but with CSV people try to handwrite parsers for it that can't handle commas in fields.
1. Most people are using tools

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.

It seems like, at least, converting a flat JSON record to CSV (or vise-versa) should be a one-liner in lots of cases.

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/

This is true, I even remember writing a few CSV files in Ansible, of all things, a few years ago.
Ignoring Commodore/BASIC, which I really just used to load things more than programming, I think my first actual programming was QBASIC in elementary school. My nerdy friend knew some, I watched over his shoulder and tried my own.

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 another day.

Story for today, please?

Well...here goes.

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.

> -if- things would have been different if I hadn't done that.

She would have found out some other way and probably with the same result.

Ugh. I hate that stuff like this exists. Even Googling the case is nothing but people grasping at straws, nothing about the facts.

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.

> writing a keylogger on commission that I believe partly led to a man's murder

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...

Now that's a story I'd like to hear...
I learned by playing with Apple Basic when I was a kid, reading the user manual that came with the Apple ][. I was drawn to it because it was fun... but I then put it away for my teenage years because other things were more fun. I actually got productive with code when I started work after college. I had an IT job, and learned from the top-down, writing scripts to help the work, writing low-code apps, and going deeper and more complex with each new project. It was a couple years later when my job officially changed to being a full-time developer.

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.

I've made a couple small apps for myself, but aside from those, I'm struggling to think of any meaningful software I've written. The software I write tends to facilitate making someone (but not me) rich, but I'm not sure if that really counts as "meaningful."
When I was little, I lamented that everything had already been invented, I was born too late to really have an impact. Truth is, there are people with problems all around that you might be able to solve. The solution could be a simple script, a standalone app, an online service, an embedded system, or something else. I've done all of those at one point or another in my career. Sometimes it would save someone an hour of work a week. Other times it allowed a capability previously unavailable and completely changed the way people were able to work.
Taught myself BASIC from the TRS-80 manuals, the “BASIC Computer Games” books, typing in code from magazines, then took some formal computing coursework in college.

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.)

Why cast such a judgmental net? I think you'll find common skill-building stories between the meaningful folks and the meaningless losers (I fall squarely in the latter camp).
I mean, I've written lots of software that's "meaningful" according to your definition, but is still not impactful beyond a limited scope. For instance, I've written code that helps borrowers manage their student loan accounts from a major loan servicer (about ~8 million users). I've written ERP software, help desk ticket management, proposal management software, HR compensation analysis, IoT security, banking account management, and all kinds of other things.

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).

Probably the things I wrote that get the most use are image chipping and embedding components for the Navy's Maritime Domain Awareness system, all of the updated security labeling for the NRO's first-level ground processing, many of the Jenkins pipeline libraries used for development automation within GEOINT programs, and some ETL scrapers for the APIs of various project management systems to pull into a corporate metrics warehouse.

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 only done a few personal projects for friends - image scrapers, PDF splitters, and such small utilities, but I've done quite a lot of work for the company I work for (my first job, still employed 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.

I work in aviation safety. I build data pipelines and statistical and AI/ML models to identify potential hazards.

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 started by reading the source code of Amazon.com's homegrown internal customer service tools when I worked there in the 1990s. Those were written in Perl. Then bought a book on C and started fiddling with that.

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.

I'm a founder and one of the point technical people for Kpow (https://kpow.io). We're a bootstrapped, self-funded, global business in a technical niche.

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.

I've been lucky to have worked on and have built what I consider both 'meaningful' and 'impactful' software throughout my now 25+ year career. I wrote code to help detect and analyze cracks within nuclear reactor steam generator tubing, code that allows US Army battlefield commanders to communicate intent and plans, and most recently code that is democratizing access to adaptive learning tools for higher ed.

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.

With so many people laughing at the infamous top comment of the Dropbox HN launch[1], I got obsess with the idea one day we would be able to generate Dropbox like UI for any protocol like FTP by implementing this simple interface:

```

interface IBackend {

   ls(path)            []file

   cat(path)           stream

   save(path, stream)

   rm(path)

   mv(from, to)

   mkdir(path)
}

```

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...

Thanks, I’ve been looking for “Dropbox on s3” for a while!
By my extremely crude understanding, isn't that basically what the FUSE filesystem interface does?
I learned programming my first computer, a Sinclair ZX Spectrum, using its accompanying manual [1]. When I wasn't busy playing games on it, I programmed things like maze generators and a connect-4 player. Then I studied Z80 assembly programming to make the latter run much faster. A few years later I started my Computer Science studies at the university of Amsterdam...

[1] http://zxnext.narod.ru/manuals/Basic_Programming.pdf