Hacker News new | past | comments | ask | show | jobs | submit login
The Importance of Humility in Software Development (2020) (humbletoolsmith.com)
289 points by raptorraver on May 12, 2021 | hide | past | favorite | 216 comments



I started attending college a year ago. At that time, I didn't know much about programming: just a bit of C and some Python - enough to make first year college projects. After I started frequenting HN, I came across a lot of comments by developers on programming languages, toolchains, libraries, etc. Even though I didn't understand their arguments, I still believed what they said, because I thought they were experienced, so they must be right. Even though I hadn't used the tools personally, I started developing premature opinions on them: Java is verbose, so it must be avoided, PHP is inelegant etc. These opinions also gave a feeling of security: because I thought that I had chosen the right language for programming (Rust!), the right operating system, the right text editor (vim), and the right window manager (i3). This made me arrogant, because I saw myself as above my classmates, who were still using 'inferior' tools and still struggling to grasp the concept of command line arguments. Over time, I realised that I was just basing my beliefs on HN comments, and it is not healthy in the long run. This article helped me a lot towards realising that. Thank you for posting this article :)

Edit: grammar


Lots of programming wars is just tribalism. Java is disliked on HN because it represent "enterprise" - big long-lived organizations which maintain a codebase for decades and therefore conservative. A different tribe than the startup tribe HN represent. Java is not in particular more verbose than say C or Rust for solving the same task, it is just a random slight on the language of a different tribe.

HN is a great community, but it has a very narrow perspective on the world.

As a beginner it is fine to chose to master one language first, but in the long run you should not "choose a language", but rater learn to learn any language, and understand they all have their strength and weaknesses.

But there are so many choices of tools and technology in this industry and it is impossible to learn it all. Tribalism makes the world simpler because it narrows your perspective.


> Java is disliked on HN because it represent "enterprise" - big long-lived organizations which maintain a codebases for decades and therefore conservative

I work on mainframes and dislike Java. Conservatism is not a problem, my problem is I perceive lot of Java people being pretty smug, and they are just because Java is #1. (And I also worked in C#, so I know the difference. Java itself is not the thing that makes people smug about it, it's the position on the popularity ladder.)

I mean, if your approach is, we use this old and tested language, it has many warts, but works for us.. good.

If you go, well, we use this language, because it's #1, and therefore it's clearly the best in the world.. no, thanks. I know Forth and Lisp and Haskell, and I know the world out there, which you don't, so I know for a fact there are innovations that didn't make it to Java yet, or pretty badly.

To me, humility in programming is (partly) don't think your tool is the best just because it's the most popular one at the moment.

Finally, this perception of Java is changing (it is being slowly dethroned by Python and JS and other contenders), and with that will come more pragmatism (less of crazy OOP and patterns cargo cults), which will actually make it more likable in the future.


Weirdly my perception of Java (and C#) is actually a bit of what you describe, but often a lot more one of drifters who know/care just enough to get a salary and continue to drag their bad legacy habits and patterns with them from role to role.

The more esoteric a language is, I find the more _passion_ the average developer has for that language, it's libraries, and tooling.

Now I'm not saying the passionate Java and/or C# devs don't exist - they certainly do, C# is my bread-and-butter and I like to think I still have a flicker of passion for my work - only that there is a vast ocean of driftwood developers making it more difficult to find the sharks.

Haskell (my perception of), for example, has demonstrated some of the strongest devoted (to themselves _and_ Haskell) developers I'm yet to meet. That market is just nothing but developers who love their toolset and just want to write and learn amazing code.


> That market is just nothing but developers who love their toolset and just want to write and learn amazing code.

The risk with this type of developer is they often prioritize their toolset and amazing code over the actual businesses needs. I’ve seen it lead to the wrong tool being used for the job.

A couple years later when these devs move on the business has a harder time maintaining the code they leave behind.

There are always drifters to be hired, which has some value.


Yes it is very much a double edged sword. The other risk associated with highly passionate Devs is that one day the work your business values no longer accommodates what tooling they want to work with, or they themselves change tack sporadically after discovering something new. I've had amazing JavaScript developers quit on me because they got bored of using react and wanted to pursue a role in Vue, for example.

But I'll take hiring (and the implied difficulty in finding) a dozen of those kind of Devs over drifters all the same.


> The more esoteric a language is, I find the more _passion_ the average developer has for that language, it's libraries, and tooling.

If they weren't passionate, why use an esoteric language? If you want an easy time, something mainstream will be easier. It isn't like anything is actually impossible to implement in C; there are just trade offs in number of bugs and time to implement. Both of which are minor impediments vs algorithm and program architecture. Anything newer than C is just bonus modern features.


> If they weren't passionate, why use an esoteric language?

Because it is kitsch. Ruby suffered this fate in the mid 00s IMHO. It gained a lot of traction because of Rails and suddenly the recruitment space is flooded with hacks and bootcampers.


Many IT workers are smug. Programmers, network admins, DBAs, sysadmins, architects. They all think they know something that other people don't (which is sometimes true!) and then transmute that feeling into a sense of superiority, which funnily enough ends up limiting them.

All programming languages are garbage to me now. Even my favorite languages. Most systems, networks, databases, are garbage to me. Frameworks, architectures, patterns, paradigms, protocols, standards, conventions..... all garbage.

I now see the whole system as like a municipal waste treatment plant. If we work really hard, the highest thing we can aspire to is to prevent waves of unprocessed shit from exploding out a release valve into a nearby stream. Our work should be unglamorous and practical, because ultimately someone's going to have to drink our water, and making sure it doesn't have shit in it should be our highest priority.


It does, at least, mean that (most of) our work is honorable and honest: keep shit out of the drinking water, keep the lights on, provide data products to businesses or people in or people for them to make informed decisions about the (business) world around them.


"waves of unprocessed shit"

I totally agree.

I also agree that the disputes about language choices is tribalisitic. There's nothing wrong in principle with Java. But Java nuts do love creating factory-factory-factories. Layer upon layer of abstractions really doesn't confer simplicity.

Most recently, I've been a PHP developer. It's objectively an awful language, that has grown by accretion, and was never designed. But it's quick to write, reasonably easy to read, and there's pretty good documentation online, and a million tons of chunks of example code.

So my choice of language is essentially tribal; the details of the language aren't really important, as long as it's not getting in the way. It's the kinds of people that use the language that matters to me.

Java's reputation as a corporate language is well-deserved; and (with exceptions) the type of people that use it seem to be corporate drones, that don't mind spending a week writing a factory-factory-factory that nobody needs.


Agreed! Most of my professional experience is in Java, and the biggest issue I've experienced in the java community is precisely this lack of humility. Usually that comes in the form of people believing that Spring is the best framework for java backend development, regardless of your needs, because it's the biggest, most popular framework. Arguments do not work on these people, at all, they start countering technical arguments with "I work at BigTech Inc. and we use Spring, so clearly you don't know what you're talking about"

Java as a language does have problems, but if you use it right, it can be pretty nice to work with. The verbosity issue is kind of a double edged sword, on the one hand there's lots of typing, on the other hand, I find it (the verbosity) can help make code very readable and easy to understand, at least if well written.


The original argument that developers who look down on Java lack humility is not disproved by the counter-argument that Java developers also lack humility.

The common factor is developers lacking humility and comforting themselves with Tribal Tool-ism.

The tools are not the issue - the attitude around them is.

It's more of an anthropological and political problem than a technological issue.

Of course there is no one ultimate definitive best language, and there may not even be a definitive ultimate best language for specific kinds of problems.

But the anthropology around Tool-ism is fascinating, and under-researched.

And it's very relevant to the real-world effectiveness of CS, because irrational professional beliefs in both tooling and management can have very harmful and expensive real-world consequences.


I actually see Java looking at itself and realizing where it need to catch up to other languages these days. As someone who grew up with Java 5/6/7, the current pace seems breakneck with much-welcomed improvements.


It's not just HN, and it's not just Java. Actually it's not just software development, it's almost everything - movies, music, sports. A is better than B because. C sucks. In certain contexts this is ok, the fun is in the pointless argument, but engineering should be more serious than that. Alan Kay referred to the whole field as a pop culture, and I can see his point.


> HN is a great community

HN feels like white collar GPT-3. It predictably likes things that are more abstract, less practical, and promise novelty while replacing the incumbent. It also used to be a very self-serving chamber for startup investors. Honestly I come for the randomness but as community it's really the point of view of vocal people only.


I see that attitude as a symptom of professional boredom. Some people like shipping products, some people like solving problems. Sometimes people who like problems build complex products to solve imaginary problems.


> Sometimes people who like problems build complex products to solve imaginary problems.

While I'm critical, I'm guilty of this. Well said.


I agree about the vocal people being the ones that influence the conversation. I hope there can be some way to fix this problem. I’ve been reading Hacker News avidly since close to when it started, and I comment occasionally when I feel like I have something unusual to offer. But mostly I don’t influence the site even though I’ve spent multiple thousands of hours here, and I wish that could be better somehow.


I try to offer the types of things that I'd like to see. Basic modeling.

I'm very much into encouraging folks to connect at a "human" level, and not treat each other as abstractions.

I also like practicality and experience. I've found that I feel as if I'm contributing, by telling stories. I'm of "a certain age," so I have a lot of them; including embarrassing ones.

    "Good judgment comes from experience. Experience comes from bad judgment."
    --Attributed to Nasrudin, but I read it from Will Rogers
It's not "making it all about me," but it is about not projecting onto others, and trying to bring my own life experience into things.

I have become a bit despairing of what has happened to the culture of the tech industry. I feel as if what used to be a fun, exploratory place has become a voracious, hyper-competitive gladiatorial arena; complete with lords on the sidelines, giving thumbs up and thumbs down.

I know that it seems as if I may be looking back with rose-colored glasses, to those that have always known the industry as it is now, but I assure you. It was once quite different. We had fun, and we shared information, and we were pretty damn nerdy.

When I was reading the various accolades about Dan Kaminsky, it actually choked me up. He was the type of person that seemed to be everywhere. The people who were really good at stuff didn't use it as a hammer to pound others; they shared their passion and exuberance.

I try, in a rather awkward way, to do that, myself. I'm quite capable of being a super-negative "black hole," but I won't do that. I wouldn't want to live in a world like that, so I won't contribute it.

Being negative is an easy way to get lots of clicks and shares, but it fouls everything it touches.


> HN is a great community, but it has a very narrow perspective on the world.

Don't you say? Isn't everybody out there writing rust on neovim?


> Java is disliked on HN because it represent "enterprise" - big long-lived organizations which maintain a codebase for decades and therefore conservative.

Exactly. But what I found is that refactoring java-monoliths can be a very interesting and intellectually stimulating task.


> tribalism

Apart from the juvenility of social memia, there is the fact that programming languages are themselves buggy, opinionated expressions of how to solve a problem. Given enough followers, some languages become very like a temple that sees no ill within its own walls.

A programmer must be able to reason clearly about the code, or something (or some opinion) has become dogma.

There are many good programming languages. Leaving tribe and tribalism brings maturity.


Tribalism is social nonsense. I taught myself C in 92 and Java 1.0 in 96. That Java was extremely verbose compared to C for chaining calls or just normal method calls. Rust is also verbose for constructing types and performing type manipulations. C is verbose for getting things done because of its low-level nature. As productivity and safety goes, I'd choose Rust over Java or C as a systems language for most purposes. The JVM is a secure foundation for running applications in multiple languages. Clojure, Kotlin, JRuby make excellent replacements for the Java language while still on the JVM.

JVM and CLR runtimes have an enormous amount of production experience baked into them. BEAM also would be fine.

It's a toolbox with tools that are better suited for some jobs than others, and it also depends which ones a group of developers know.


>Java is disliked on HN because it represent "enterprise" - big long-lived organizations which maintain a codebase for decades and therefore conservative.

Yet HN commenters tend to like the React ecosystem, which at this point is pretty close to Web Development Enterprise Edition.


> Java is disliked on HN because it represent "enterprise" - big long-lived organizations which maintain a codebase for decades

It's one of the few languages out there capable of producing a codebase that lasts for so long. That annoying verbosity and enforcement of naming conventions and directory structure mean that the Next Guy (or Gal) to come into the project and probably figure out what's going on. Most codebases written in other languages are constantly rewritten in the language de jure.


de jure -> du jour

"by law" -> "of the day", "current"


>As a beginner it is fine to chose to master one language first, but in the long run you should not "choose a language", but rater learn to learn any language, and understand they all have their strength and weaknesses.

Exactly. Languages come and go. But if you understand the fundamentals - why things work the way they do - it makes it much easier to move between languages, programming models and whatever the latest fad is. Being adaptable is a far more valuable skill over time. Nope, it's not easy - but rarely are things of value easy (it's why they are valuable - ha!). It is easier to start out early with this perspective and continually building on it throughout your carrier than trying to pick it up mid stream later on in life, so the sooner you start the better! I've never considered myself "done" when it comes to reading or learning. Like those sharks that die if they stop swimming - that's a good way to envision your long term intellectual health :)


Java is miserable to write. You don’t realize this until you work with other languages. It was literally built with guardrails to keep enterprise coders from getting too creative


Yes lets rewrite everything Ruby on Rails and CoffeScript, it is just so much more productive and creative! At least this was the opinion on HN a few years ago. Now of course other tools and languages are fashionable. And nothing against Ruby or CoffeScript per se, but the demands of an enterprise where software lives for decades is just different than for a startup which rewrite the whole stack every six months.

Creativity and cleverness is a double-edged sword, which is exactly what Dijkstra is talking about.


Compare writing Java professionally with writing Kotlin professionally. It's like night and day. Same projects, same VM, all that's different is the language.

Distaste for Java isn't elitism or arrogance, it's just that the language is so damn painful to write.

If you start your career with Java (as I did), dipping your toe into another[0] language for the first time feels like Neo being ejected from the matrix and waking up to reality.

You realize your eyes are finally open, you're awake, and you can see that all that pain was just what Java saddles you with, and wasn't "the way programming is done (TM)".

[0] depends on which language, of course. Java to C# isn't a big jump.


Could you write your top 3 Java pain points?

I started working in C++, moved to Java, used several other languages commercially (Python, JS, PHP, Groovy, Kotlin), and about dozen other languages for personal projects including the hip ones like Clojure, Prolog, Ruby.

My first programming languages were C64 BASIC and Turbo Pascal. I've written some Ada and SML.

And I just don't understand the Java hate.


I have worked in Java shops my entire career (Travelocity, Orbitz, Expedia, Southwest, Bank of America) and have lots of pain points. In these cases Java is used to prop up a web server and typically with Spring.

Pain points:

* Stack traces seem to run to 500+ lines and nobody reads them.

* The processes, release management, and integration of code in a Java environment is glacial slow and obtuse featuring very low automation and many large teams of dev ops. The very idea continuous deployment is absent. Code releases occur at regular intervals quarterly or monthly if you are super fast and it feels like moving a continent. All of that slowness and super man power also applies to everything else not written in Java like riding on the back of a retardant elephant.

* Java applications running enterprise web servers are monolith beasts like the Great Wall of China wrapping the Pacific. Refactoring in those applications feels like inventing a new language while sinking in quicksand. Writing a JavaScript application in a massive MVC framework feels like that too but Java is orders of magnitude worse.

* What I really don’t understand is that Java is such a fast language but large enterprise web server applications written in Java always feel so slow in user experience in production. It just feels like something from the late 90s. That slow becomes the baseline experience to internal development by which all user experience ultimately suffers. There is no reason pages from these servers should take 5-20 seconds to fully load in the browser even though the page is a light smattering of static text with sprinkles of CSS and JS. I have an application in TypeScript that emulates the front half of an operating system and it fully loads in the browser in 0.3-0.8 seconds (averaging around 0.65 seconds).


> What I really don’t understand is that Java is such a fast language but large enterprise web server applications written in Java always feel so slow in user experience in production. It just feels like something from the late 90s.

My personal suspicion is that the programming style used in Java (OOP and patterns) together with the fact that everything is a reference, and everything is implemented in Java itself way down, kills the cache locality, which is the thing that makes modern computers fast.

Yes, you can write fast Java programs, if you keep abstractions to a minimum, use arrays rather than objects when allocating, and take advantage of the JIT compiler. But these are more lab conditions (which are great for benchmarks) rather than the real world conditions. I think finally having a proper record type in Java will help to fix this.


Shitty, poorly-run corporate behemoths (a) are shitty and poorly-run and (b) use Java, because it's an industry standard. You are making the error of thinking that the latter consequence causes the former.


Interestingly, the old COBOL/CICS/DB2 stacks do not seem to have this problem (and they are run pretty much only by corporate behemoths). Why is that?


less hardware to throw around = better (simpler) codebase


> Shitty, poorly-run corporate behemoths (a) are shitty and poorly-run and (b) use Java, because it's an industry standard. You are making the error of thinking that the latter consequence causes the former.

Other programming languages make it "more inconvenient" to apply such managament/programming practices.


> Stack traces seem to run to 500+ lines and nobody reads them

ok, you have a point here :) when you have libraries for filtering stacktraces you know something is wrong

> the processes, release management, and integration of code in a Java environment is glacial slow and obtuse featuring very low automation and many large teams of dev ops. The very idea continuous deployment is absent

that is the exact opposite of my experience - maven infrastructure beats anything C++ or Python have, and in every Java project I worked on we had CI (mostly BitBucket+Jenkins but I've also seen Apache Continuum and Team City and we had CI even back in svn/cvs era).

> large enterprise web server applications written in Java always feel so slow in user experience in production

Also not my experience, I've worked on an intranet app for warehouses that used jboss 4, jbpm 3 and plsql at the backend and a very small custom c# client running on remote Windows CE terminals. We had transactional and persistent business processes drawn as graphs invoking PL/SQL on the server, it was pretty nice. And the full roundtrip between pressing a key on a remote terminal and rendering the received response was under 150 ms. That's for all the layers: - c# client -> intranet -> SOAP on jboss -> EJB3 -> jbpm -> hibernate -> JDBC -> PL/SQL and back

And it was around 2008 - in the age of spinning disks :) Certainly it was good enough for us and actually faster than previous simple code that we were replacing (remotes telnetted to a C++ text-only server that connected to the same business logic in PL/SQL). ORM cache wins covered all the performance loses caused by additional abstraction layers.

We didn't use html/js/front-end templating engines tho, at the time most people used JSF or similar and it sucked. We had a custom XML protocol that was rendered by the C# client and it was very fast.

Of course it wasn't that demanding - under 500 users all on the same local network. But without any thought spent on optimization (other than enabling 2nd level cache in hibernate) it was a pretty good result.

> There is no reason pages from these servers should take 5-20 seconds to fully load in the browser even though the page is a light smattering of static text with sprinkles of CSS and JS.

well yeah, something's wrong. I bet on data layer or passing each request through 20 microservices on different continents (this is the most recent fashion in server-side programming and it sucks).


Haven't upgraded Java since version 9, so take this with a cube of salt (my suspicion is that many hardcore Java haters were created by Java 5, 6 etc).. but my general issue is the readability. The idioms used to perform 'standard' things are verbose. The worst for me is that it's impossible to catch exceptions in lambdas. The absence of named or optional parameters.

Mind you, I'm only saying that after having spent 2 years in Kotlin. The Stockholm syndrom is real: you don't realize how much better things can be from the inside. Programming has become enjoyable again, my work 'feels' cleaner, more readable. Null safety makes reasoning about code that much easier. I can switch to functional programming when it's convenient. I keep all the tooling from Java, including the amazing IntelliJ IDE.

At the end of the day, choices are a matter of arbitration. Do I want the speed of C, the ecosystem and resource pool of Java, the locality / mathematical guarantees of functional languages, and the IntelliJ IDE? Sure. But they don't exist in one language.

So when I'm programming embedded, it's C. When I'm creating a complex data treatment pipeline for machine learning, it's Scala. And when I'm making a CRUD application that will have to support a team of 15 developers hacking on it for a decade, I'll go with Kotlin.


>The worst for me is that it's impossible to catch exceptions in lambdas.

I don't take issue with your comment overall, but this is not true. You can catch exceptions within lambdas, and you can define functional interfaces that declare that they throw checked exceptions.


You're right. It's been a while and I forgot the exact issue. I looked it up on StackOverflow, to refresh my memory [1]. It is indeed possible to thow exceptions within a lambda.

My issue is that for something as everyday as "throwing exceptions", you have to define a separate interface, or catch it inside the lambda. The first option being the Evil Verbosity everyone is on about, the second essentially rendering the exception useless as an instrument.

[1] : https://stackoverflow.com/questions/18198176/java-8-lambda-f...


Java, in my experience of having to puzzle out a couple of large codebases in my career (that is, not having been a serious developer) is what happens when a couple of idioms run amok.

Inversion of control, interfaces, and OO make wandering a codebase feel like being lost in a bureaucracy.

Then we het to the issue of projects being coupled to IDEs. "Oh, this is an Eclipse project." "Oh, this is IntelliJ".

All of that chrome and tailfin leads to projects that take longer to boot than the OS.

The disdain for Java may be less about the language per se than the attendant mindset.


> Then we het to the issue of projects being coupled to IDEs. "Oh, this is an Eclipse project." "Oh, this is IntelliJ".

We use Maven projects, and edit them in whatever people prefer to use.


Yeah that's a weird complaint. Java build system situation is better than most other languages. Especially C++ is in stone age comparatively.


Maybe it was more historically true. Then there was the Ant vs. Maven vs. Gradle thing.

This would not be such a complaint (look at the explosion of build systems everywhere) if Java were less touted as "write once, run anywhere".

Build systems and configuration management are two hard problems.


Maven and gradle projects can depend on each other, are producing the same kind of artifacts and deploying them to the same repositories. And both can be used in any IDE you like.

And ant is prehistory.

In C++ they don't even have Maven equivalent (only thousands build systems but no universal way of naming/deploying/running projects or specifying dependencies).

In Python there's several maven-like systems that are incompatible and don't have the concept of universal project identifier or repositories.

In JS and Rust they basically copied the Maven system and changed it a little.

Clojure uses Maven wrappers with lispy syntax for pom files.

I struggle to find a language where this is solved better than in Java.


All the problems here are solved till Java 15 in every iteration. A lot of opinion in Java is based on comparing old versions of Java with latest version of other languages


Bear in mind that I've written almost no Java since 8, so this may well be out-of-date.

With that in mind, though, the biggest gripe I have, by far, is its needless verbosity. It always feels like I need a huge amount of boilerplate and repeated keystrokes to get things done. My fingers literally get more sore writing Java than anything other language.

Lack of extension methods is probably my next complaint, because you end up fumbling about writing a lot of code to address what should be

Lack of null-safety would be the next one, too. I'd say around 90% of my runtime errors are due to improper null handling, so this would cut down a huge source of errors.

On par would be painful deployment (and to a degree, package management). For some reason Java always felt like it needed an industrial-size team to get anything actually up and running, and needed more hardware than any other language. That might not be fair, but I think it's definitely fair to say that deployment is not Java's strong point.


> With that in mind, though, the biggest gripe I have, by far, is its needless verbosity. It always feels like I need a huge amount of boilerplate and repeated keystrokes to get things done.

This is my biggest complaint about OOP development in general and languages like Java and C# that are heavily invested in OOP paradigms are miserable for me as a result.


"more hardware than any other language"

It doesn't, in fact; but configuring a Java application to run well with minimal resources is a problem that isn't a programming problem, it requires a separate skillset. So you end up with build specialists, and deployment specialists, which in turn results in long deployment timetables.


I can’t speak to the actual act of Java development, but I can speak to Java applications from a sysadmin perspective (15 yr Sr. QA Engineer to a 3 yr Linux admin (don’t ask)) — I’ve got no real beef with Java from the development side, but maintaining some of those stacks in production is pure pain.


Huh? Java is probably the least demanding stack from the sysadmin side - no big chains of library dependencies, no docker, strong backwards compatibility that means you can fearlessly upgrade the language. All you have to do is keep an up-to-date JVM installed on your servers and deploy single-file fat JARs to them.


Then you get into managing a collection of Java projects where each on ships its own JVM and keystore to obviate version issues.

And then you have to deploy certificates against all that.

I'm not bitter.


The keystore situation is indeed poor. For several years now, it has been possible to do more key management in-app, so you don't need to manage keystores (i have written programs which pull standard PEM-encoded keys from environment variables). But the practice of using a JKS keystore is so ingrained that it's very rare to make use of that.


Until you get an out of memory error. Then you need to start fiddling with the JVM.

Or until you realize that you have a 99th percentile latency of multiple seconds...


No language is immune to slow or memory-hungry code. The JVM is probably the easiest runtime to monitor/instrument/profile (and it's not like having no runtime makes that any easier, quite the opposite), and has probably the most tuneable GC going.

I guess enabling your users to do that might be work for a sysadmin, but that's more a reflection of those users having higher expectations for Java than for other runtimes - providing your users with the same capability in other stacks is never easier than Java, and often significantly harder.


There are only a bunch of out of memory errors, though. And they're easy to fix.


I know this is just flamebait, but I write a lot of Rust, Python, Java, C++, Ruby, Typescript, etc. Java is fantastic to write in. What guardrails are you talking about?


My guess? Lack of first class functions and macros. Maybe higher kinded types.

The first one is annoying, not really something a professional software developer would care about for more than 10 minutes while creating a new product.

Macros can be major footguns, they're something that can only be realistically used efficiently and safely in large code bases by actual senior engineers. So the jury's still out how much they really increase productivity for the averaged developer.

Higher kinded types seem great, but it seems that they're not easy to implement and they also slow compilation down a bunch (someone please correct me on this). These seems hard to bolt on to an existing language, so Java can't be faulted much.


Java itself may lack macros, but by the time you get in reflection and libraries with XML and compile-time magic to work around the lack of macros and the whole thing is a giant plate of spaghetti, maybe macros were no' so bad after all.


Those would've been my guesses too, but Java's had first class functions in the form of anonymous classes since 1.1, and as the other commenter mentioned reflection takes care of a lot of macro use cases.


Problem is not with programming languages. It is with lack of programming principles. For eg. Consistency, Readability, Maintainability. Software requirements keep changing with time & so if we do not do continuous refactoring, we see a decay. Also in enterprises team ownership keeps changing & we miss the accountability. This erodes software. People need to give a damn to maintain software.


That's like a mason or an engineer complaining that the bricks are too boring and predictable :)

There's a place for "artistic licence languages" like Ruby or Clojure and I like them for experimenting, but when you want to build a house you want the bricks to be boring.


I think those guardrails often help with the humility the article discusses - they reduce cognitive load, and let you focus on the problem at hand, at the expense of expressing total creativity. It's a tacit admission that we aren't all knowing, and often need help from our tools to save us from ourselves.


I find it's just the opposite - when working in a Java codebase you can't focus on the actual problem because you have to spend so much of your time reading past the needless verbosity - or, often, debugging the crazy reflection framework that your organization has introduced because that verbosity became intolerable.


I think you're both correct.

I find that the language itself is quite good, simple to use and has some nice features and performance... but the issues you mention are also there, however they're part of the frameworks and individual codebases.


> crazy reflection framework

Did the Java community get over their love of code generation already? Last time I used it, I'd debug the crazy 1000's of computer generated lines that people changed here and there.


That's never been my experience in over 10 years of JVM work - people mainly use reflection or bytecode manipulation (aspectj) to do the kind of things you'd use code generation for. The only exception is thrift/protobuf and that's dumb serialization code that hopefully no-one's editing.


Oh, the last time I've made any extensive use of Java was more than 10 years ago. I've met an off the shelf code generation based platform on the meantime, but luckily it was deemed too expensive so I didn't need to even finish a technical evaluation (much less use the monstrosity).

Anyway, that is great news. That unexplainable love for code generation was one of the things holding the language back. It's always good to see things improve.


> It was literally built with guardrails to keep enterprise coders from getting too creative

Just as Go.


Go somehow takes the worst bits of Java in this regard and makes them even worse :(


> It was literally built with guardrails to keep enterprise coders from getting too creative

You say that like it's a bad thing...


A programming language is one of the more important tools as a software developer. Having to use a suboptimal tool is neither productive nor fun. You can't always have the latest tool of course, but Java is quite outdated in many regards (even though starting to catch up a bit recently).

I think it has nothing to do with being "enterprise".


As a person who has learned and used several programming languages (not exceptionally many, but enough to be able to start new projects with "hmm, so which language I already know will be the best for this"), I have never taken these language wars seriously. It's actually kinda surprising to me that some people apparently do. Do they take vim vs. Emacs holy wars the same way?

I mean, plenty of arguments used in those wars are perfectly reasonable. PHP isn't elegant. Java is verbose. C++ is overcomplicated beyond salvation. JavaScript is shit. Those are all facts ;) However, they still can and often are the best choices for a given project. Is PHP pleasant to write in and think about? Heck no, but deploying it is exceptionally easy and sometimes that's much more important. I wouldn't ever think of using JavaScript as an example of good language design, but it accidentally turned out to be flexible enough to become the lingua franca of the Web and is here to stay. No amount of drooling over Rust will change the fact that you're going to have a hard time with it on some platforms where having a proper C++ toolchain available is ubiquitous. And sometimes the way Java code use to be structured is exactly the perfect fit for a project you're working on to ensure its long-term maintainability despite of the fact that people who work on it come and go in your startup all the time (so having access to a healthy pool of Java developers to hire from who's pretty much already familiar with your project despite of never seeing it before is a huge advantage).

If those tools really were "suboptimal" they wouldn't exist anymore. They do, because they aren't - if anything, they may be poorly chosen to do a specific job.


I think "language wars" is exaggerated a bit. Yeah, maybe some people see it as a "war", but for me it's just about tooling. When I say "gas-powered cars are outdated in many regards" then I just mean that they e.g. don't accelerate as fast and are noisier. Some people make a war out of that though, that's true.

I agree with everything you said.

> If those tools really were "suboptimal" they wouldn't exist anymore

A tool (such as a language) can certainly be suboptimal on its own but still be productive because of the package of the language, the ecosystem, the knowledge that people have etc.

My point is, even if Java would offer the best package, it is still valid to criticise the shortcomings of the language and dislike this part of the package. It doesn't have to be "hate because of enterprise".


General statements like "...Java is quite outdated in many regards..." without providing any specifics are a sign of mentioned tribalism. Such general statements don't bring quality to the discussion, because nobody can really check whether Java is really so outdated or not.


I replied specifically to

> Java is disliked on HN because it represent "enterprise"

which I think is not true. Maybe for some people, but there is valid criticism too.

I am happy to give examples, but I am disappointed that you call my response "tribalism". It really is not meant like that.


If I personally dislike XYZ I could write "XYZ is quite [outdated/boring/miserable/painful/awful/uncreative] in many regards". But people here are more interested in (specific) advantages and disadvantages than my personal taste...


Most important tool is the programmer. Suboptimal programmers are worse than suboptimal tools, because suboptimal programmers create suboptimal tools.


I'm not personally a Java fan, but "java is quite outdated" is a quite outdated statement itself.

Sure, it's not as fast to add stuff as C#, and also surely anyone looking for a fight can nitpick, but it has most modern features you'd expect a modern language to have.


I acknowledge that it improved recently and I'm not saying it is a bad language. But it is missing a lot of features and convenience that the majority of newer language add. Java prefers to put a lot of emphasis on compatibility, which also has its merits. But the language itself (not ecosystem/tooling) is outdated in many areas. I stand by that.


I’m sorry but Java is an awful language that is mostly used because you are forced to, or because that’s the only language you know. There are much better modern alternatives.


What an extremely typically HN comment.


It might be what us typical for now, but hopefully if we recognize it as a bad comment it won’t be in the future…


Much like "1 + 1 = 2"


You can read this to see how modern java differs from the java 15 years ago: https://wittchen.io/posts/an-opinionated-guide-to-modern-jav...

Also the JVM is highly optimized, more stable and faster than most other runtimes (and it can run must of the other languages).


Parallel Universe blog is 404'd :(


> mostly used because you are forced to, or because that’s the only language you know

This probably describes 99% of all programming done today, no matter the language.

Not everyone is a polyglot programmer able to choose their tech stack at their company.


Try reading the blog again.


The flip side of having "premature opinions" is that, at the very least, you gained a lot of data points early on :).

It's kind of like with assembling a tricky 1000-piece jigsaw puzzle. You assemble the frame first (like everyone always does), and wonder how to fill it in. You could pick the most obvious feature on the reference picture, start there and focus on expanding it piece by piece until the picture is done. But what I imagine most people do is first speculatively placing all the pieces that seem trivial to match to corresponding picture features, in order to reduce the number of unplaced pieces quickly, and give themselves lots of starting points to expand their solution in parallel. This approach is useful despite it commonly turning out later that some of such early starting points are placed completely wrong - puzzle blobs get easier to position correctly once they grow in size.

It's a long way of saying, if you keep track of confidence levels of your beliefs, instead of taking everything you read on the Internet as certain, even off-hand remarks on HN can be useful in navigating the enormous space of technologies and philosophies that form the software industry.


To be fair though, there are better and worse tools. There are legitimate reasons to say that PHP should be avoided and that Rust is a good choice. It's just important to understand how much weight these opinions have and understand why they apply.

If you are building a bulk file rename tool, it doesn't matter how you do it as long as it works. If you are handling untrusted data from remote sources, then you may want to consider if C is a good idea.


I agree with your points completely. Some tools are just better designed. I was talking about the premature opinions I had on these tools before I had even used them, or seen them in action. This is a problem as it limits my teamworking capabilities. For example, I decided to do the first year programming project all by myself as I thought nobody else could do it.

Edit: added an example


I have a somewhat funny anecdote on this. One of our sister cities had a tool for handling city-water or something along those lines, that was build in ASP Web-forms.

All the city engineers were perfectly happy with it, but the developers behind it were worried that ASP web forms were becoming obsolete. Not really an illegitimate concern I supposed, but what they did was hire a company to rebuild it in AngularJS.

So now they have a technology nobody else uses around here, while web forms simply turtles on because of how much legacy it has in various places that aren’t upgrading it.


> the right operating system, the right text editor (vim), and the right window manager (i3).

As a TA I see a lot of people who also made these same decisions, maybe just add Arch Linux and zsh to complete the cliche. So you don't have tl worry, as this is actually relativly commom.

But I don't think it is wrong to have intuitions based on stories, as long as these don't prevent you from trying out said tools or languaged yourself. They can be right, but they might also be outdated. Just stay curious.


I find this interesting because I've always been suspicious of anything hailed as the next big thing and obvious right choice. I've deliberately tried a lot of alternatives.

And yet, after many years, as I've finally stabilized on a set of tools and workflows I feel really works for me, it happens to include Vim and Zsh. Of all the programming languages I've used the one I've enjoyed the most is indeed Rust. I have even come to really enjoy Unity after ending up at a company which uses it.


One thing is if you tried out different things and decide to use whatever tools you like, the other thing is seeing people use, eg. vim and just copying it without understanding why. The reason this perplexes me is that so many people end up with a working but ineffective workflow, for no real reason.


I know precisely what you mean. I've seen a few posts from people about how they finally transitioned away from Vim (or C++, or ...) after many months and then detail a long list of its flaws, all of which showcasing that they did not try to actually learn Vim, but rather try to work around it being Vim.

It's a bit different from other tools and if it's not your cup of tea that's perfectly understandable. But why would you torture yourself like that if you're not willing to give it a fair chance?

Edit: there are of course also those who do give it a shot, do learn the Vim way™, and then conclude it's not for them. That's great, I have no problem with that.


That's a very good way to put it, I might steal it at some point...


Curiosity is what caused me to frequent HN :)


I wouldn't say the primary takeaway from this post is to remind programmers to be humble. It's a takeaway, yes. But humility comes and goes, and reminders often take the form of bugs in your code that you didn't expect.

I would argue the post is primarily about complexity, and in school you probably haven't seen how complex software can get because most projects have to be started and finished within two to three months. Once you start working, you'll quickly discover that the complexity of existing systems can be overwhelming, but this is normal.

After 3-6 months working on a complex codebase, ideally with a team to help you, you'll have some idea of how the complex system works, and even if that idea is wrong (in many, many places), it will help guide future changes to the system.

The point then, of reminding programmers to have humility, is less about hearsay on the internet and more about the need for tools and languages to make life easier for the individual programmer trying to read the code, then plan, make and deploy changes to a live system. If you're lucky, you'll feel like the system makes sense but changes too quickly. If you're unlucky, the system will make little sense and it'll be entirely your job to fix it or put up with it. Usually, hopefully, there's a middle-ground, where the system works well enough you don't have to make changes, but you're probably not entirely satisfied with it either.

Humility can also be the reminder that just because a system looks broken (to you) doesn't mean it needs fixing right this second. If you can spare the time, it's almost always better to try and understand an existing system's quirks before you set out to redesign it and end up re-implementing some of the same quirks yourself.

I'll echo mentions elsewhere in this thread and suggest John Ousterhout's A Philosophy of Software Design as a good book on the subject of complexity and API design, but to newcomers to the field, I'll leave the warning that it doesn't cover TDD as much as it could and it also doesn't cover modern Scrum/Agile practices and how development fits in with product design and company goals. But I still highly recommend it.


I also recommend listening to podcasts like Changelog[1] in which developers are talking through how they approach problems etc., and trying to back up what you don't understand online by watching YouTube conference talks, ideally ones with examples in them from the real world.

Usenix talks, for example, tend to cover a lot of real-world engineering-at-scale challenges. The more you hear how programmers often make mistakes, the more the lessons around humility will sink in. :)

[1]: Re. changelog, and the subject of both mistakes and TDD, https://changelog.com/gotime/174 was a great listen also. Testing has gone from niche to mainstream back to "the best projects do it, but maybe only when forced," and it's interesting to listen to modern takes on what to test and when.


To have access to (or sense to use) better tools for given task is good. To be smug about it is bad. Actually, drop everything about technology in this discussion: being prideful is just bad.


Personally, I dislike Java, and I never got good enough at it to develop any worthwhile opinions. That said, I really despise PHP, but spent 20 years, writing it, and doing a fairly good job, because it was the best tool to give me the results I needed.

I feel that if we will use a tool, we need to take the time to become proficient with it.

Here's an article that I reference fairly often. It's sort of a "reality check": https://veekaybee.github.io/2019/05/10/java8/


"we need to take the time to become proficient with it."

I have thought this for a long time.

I have reckoned that it takes me at least six months full-time to come to grips with a new programming language (I'm 65 now, I learn slower, I'm retired, and I'll be damned if I'll learn any more).

Over the years, I've worked in teams dominated by young whippersnappers who are very keen to learn the latest language/library/framework. But they don't allocate 6 months; they seem to think they can press their new tool into production after just 6 days' practice. The result was unsually unmaintainable code.

I understand the motivation of the whippersnappers; they expect to change jobs within the next 6-12 months, and they want to be able to put the latest hot shit on their CV. But we ended up with systems that only a couple of people in the team could read, let alone maintain.

Write Simple Code. Don't Be Clever.


Good for you! I think one of the more important lessons is to realise that the programming community can be very disconnected from reality. This is especially true for HN with its heavy focus on “interesting”. Judging by HN, things like Erlang, Rust and previously Go, would see a lot of attention and so would the Kubernetes way of doing CI/CD. Interestingly there hasn’t been a single Rust, Erlang or Go job offering available in the region of the world where I live since I started tracking them out of interest after a similar discussion on HN in 2019.

There are however a constant demand for JAVA, C# and PHP developers. Because that’s the languages that are used in my region of the world, and as interesting as something like Rust might be, you’d have a hard time actually finding a job working with it. Even JavaScript isn’t that outspread here, if what you’re after is a full-time JavaScript job, because there is almost always a JAVA, C# or PHP backend to go along with it. You can of course find C++ job, there aren’t many, but there are some and I’m sure some of those places actually use Rust behind the scenes, but they don’t advertise it.

Anyway, I think my point is that there can be a big disconnect between HN and what you’re actually going to end up working with, and you’re likely not going to work with just one toolset for your entire career either. Before I became a manager, I spent almost a decade working mainly with .Net, but with the rise of things like Azure Services I stated working more and more with Python and Powershell, these days I almost exclusively work with Python as I’m mostly handling data for BI or management purposes and let the programming get done by my developers. We have recently picked up PHP though, which you likely wouldn’t think would happen in 2021 if you go by how dead PHP is supposed to be. Well, it so happened that there is a big open source project in my country that utilises Drupal to create a “forms generating” CMS system, that we want to be capable of building modules for, which means we needed someone to learn PHP.

Another really valuable lesson in humility I learned, and it took me years to do so, is related to the arrogance many software developers adopt when we get into the real world and start building things with the business side. Because our skill-set is so linked to dissecting and understanding problems, some of us adopt the unfortunate habit of thing we know... well everything. I’ve been arrogant enough to think I understood how our payment business process worked better than our director of payments, and of course I didn’t, but it was just so used to handling problems that I though I did. If you can, do better than me and apply your humility to everything, not just tool chains.


> JAVA

It's just "Java".


Unless you're mad at it.


You sound a lot like me in the early parts of my career. Strong opinions are worth something when you're just getting started out, I can't quantify what they're worth but they do something beneficial in terms of speed. The downside is that anyone with perspective on their side is probably laughing (maybe giggling) at your strong opinions.

If your journey is anything like mine you will end up driving yourself lower and lower into the stack until you wear yourself out. Ideological buoyancy will take over and you'll float somewhere higher, but you'll be much more knowledgeable and valuable as a result. All that to say, don't be too hard on yourself.


> Java is verbose, so it must be avoided, PHP is inelegant etc

I think that these opinions are mostly correct, but you and anyone else would learn a lot if you chose to actually try Java and PHP and experience this verbosity and inelegancy first-hand, as opposed to just hearing about it.


I think that important part is "opinions also gave a feeling of security".

I see it all the time in my daily life, people are insecure and mostly want some confirmation that choices they made are good ones.

They buy a car and then they start saying that other car brands are bad or breaking so easily. They cannot face the truth if their car turns out to be a crap. Seems totally like programming language bros, and some people cannot stand that in other language they could make more money. So what? There are probably people using that language that make less then them.

I don't want to live such life, I want to make mistakes and pay for them if needed. Lots of choices are reversible or can be changed, be flexible.


100% agree that humility is important. And realising that at young age is great :) However, with over 25 yrs dev experience, I do believe its true that Java is verbose (and some of its frameworks hideously so), and PHP is inelegant. Both languages have improved a lot over the years, thanks to a bunch of smart people working on them. Having now decided your opinions were premature, you may one day come to the same conclusion based on experience. Python, OTOH, well, that's a lot of fun. Has its issues, but, overall nice to develop with.


Hacker News shows me the "Gell-Mann Amnesia effect" quite vividly. When people here discuss topics that I know a lot about, I often quickly realize that more than half of the people commenting are saying nonsense. When people here discuss topics that I know little about, I am often impressed by the jargon and tone of utter conviction.


I am hopeful that you have misread the consensus that vim is most commonly used by those on HN... emacs is obviously the better choice and needs to be perceived as the best/most popular to keep the community active :)


Rust is a good choice. It will serve you well.

In my experience, I can learn a new language (and general style) serviceably well, in just a few weeks, but it can take years to learn the language in-depth, with the language being a “moving target,” as it evolves. I decided to specialize in Swift, and still have a lot to learn (I’ve been programming in Swift since the day it was announced, in 2014). Part of the reason for the time it’s taking, is because I have been using it to ship products, which slows exploration and research.

What really takes time, is platform SDKs and frameworks. They can be real rabbitholes, with all kinds of idiosyncrasies and caveats. They, too, are generally “moving targets.”

Good luck in your endeavors. I really enjoy programming.


The more you learn, the more you grasp the massive quantity of knowledge that you don't have. You can't learn or improve if you think you know everything.

I would say humility is the most important quality for an engineer to have if they want to be able to grow as an engineer. I've come across a small number of engineers that have lacked humility and acted as if they knew everything and they were a nightmare to work with. The first instinct they have when they approach most problems that they come across is that the issue can't possibly be caused by their code and you have to provide an unreasonable amount of evidence or a smoking gun to convince them to investigate their code. They design solutions as if they know the perfect way and they seem to lack empathy for users or others that may have to maintain that code.


> PHP is inelegant etc. ... who were still using 'inferior' tools

Well... PHP is inelegant, and there's a reason that it's been abandoned. However, it's actually worthwhile to spend some time discovering that for yourself - if not about PHP per se, then about a different "blunt" tool. Part of the modern computer science discipline is working through exactly why so many simple-seeming solutions fall apart - it isn't obvious, and it's really important to internalize.


"Well... PHP is inelegant, and there's a reason that it's been abandoned."

Abandoned? 79% of websites are still running on PHP. Let's postpone the funeral.


Good for you. It's takes most people a lot longer to come to that realization.


> Even though I didn't understand their arguments, I still believed what they said, because I thought they were experienced, so they must be right. Even though I hadn't used the tools personally, I started developing premature opinions on them

> This made me arrogant, because I saw myself as above my classmates

As others have said, "good" and "bad" depend on the use-case; everything has pros and cons; but some things are still objectively better than others (e.g. if tool A supports more data formats than tool B, whilst being just as fast, just as secure, just as supported, etc. then A is a "Pareto improvement" over B; there is no reason to choose B for a new project).

Whilst it's common to explain why something is "bad" (e.g. PHP encourages 'stringly typed programming', which makes SQL injection and cross-site-scripting vulnerabilities more likely); it's also important to explain why such "bad" tools are nevertheless widely used. For example, PHP is widely supported by free/cheap web hosts, is easy to set up (just copy a .php file to the server) and run (the URL is the .php file's path); it runs concurrently without needing shared state/threading/etc.; it has a built-in Web framework ('$_GET', '$_POST', 'echo', etc.); it can be embedded inside HTML files; and so on. This all helped it grow a large community in the Web 2.0 days, and lead to useful applications like Wordpress and MediaWiki, whose 'plugins' got many people into programming. This community of pragmatic (but often inexperienced) developers and their ability to quickly churn out Web apps has sustained itself to today; whilst the developers have matured, applications/libraries/frameworks have grown much more complex, the demands on the language are more diverse, and the language maintainers add new features and fix some of the language's underlying problems.

I still consider PHP to be a particularly bad language, and would need an incredibly compelling reason to choose it for new project. Yet I know there are many reasons why people have chosen it, and continue to do so. Those aren't necessarily "pros" for the language, e.g. it often comes down to historical inertia and 'what we know', which is much less important for those just starting out, or working in a different field (e.g. data scientists), or facing a different context (e.g. Web apps implemented client-side, fetching data from managed cloud services).

If we see the arguments against, but don't know much of the context or reasons things still get used, it's easy to make the assumption that others made bad choices due to ignorance. I think this is similar to Chesterton's Fence https://en.wiktionary.org/wiki/Chesterton%27s_fence i.e. we should understand the reasons why someone did things in a particular way before we scoff at their poor life choices (after all, sometimes those reasons make it even more hilarious!).


> PHP encourages 'stringly typed programming', which makes SQL injection and cross-site-scripting vulnerabilities more likely

Every language phasing the web is stringly typed, I have seen unproper filtering and escaping in all languages I worked professionally with.


> Every language phasing the web is stringly typed

Heh, not even close. Off the top of my head I can think of Ur/Web as an extreme example ( http://www.impredicative.com/ur ), and slightly more mainstream systems like Yesod ( https://www.yesodweb.com ). I've worked professionally with Haskell, although not for Web stuff. These days I mostly work with Scala, which has a similar typing mindset to ML/Haskell, but unfortunately inherits a lot of stringly typed legacy from Java. We use an in-house library that provides zero-cost newtypes to distinguish between different semantically-distinct data types, many of which just-so-happen to be representable as subsets of String (e.g. GET parameter names, GET parameter values, POST bodies, etc.). This makes it a type error to try and e.g. concatenate different sorts of data together.

W.r.t. "escaping", I tend to avoid it entirely since it's inherently unsafe:

- "Escaping" doesn't distinguish between its input and output types; they're both just "String", and we have to make assumptions about the contents of each (i.e. it's unsafe)

- Having the same input and output types makes it possible to "double-escape" by accident. This discourages the use of escaping, just-in-case it happens to be done elsewhere; hence it's very common to end up without any escaping taking place.

- Having the same input and output types makes escaping functionally unnecessary: anything we do to an escaped string could also be done to an unescaped string, so it's up to us to remember that it's needed (i.e. it's unsafe).

The whole idea of "escaping a string" betrays a flawed approach to the problem. Instead of throwing everything into the same representation, then manually trying to figure out whether or not a value comes from a particular subset of that representation or not, it's much easier and safer to avoid lumping them all together in the first place. If our inputs have a certain type (e.g. HTTP.Get.Val) and we can only output certain other types (e.g. JSON, Map[HTTP.Header.Key, HTTP.Header.Val], etc.), then the processing which turns input into output is forced to specify any necessary conversions. Whilst such conversions may involve escape sequences, having them associated to particular types is more akin to serialisation.

Heck, at my first PHP job we largely solved this problem not by 'filtering and escaping', but by modifying the PHP interpreter to distinguish between 'clean' and 'dirty' strings (with literals being clean, and $_GET, etc. being dirty). Operations like concatenation would propagate 'dirtiness', and output functions like 'echo' would crash if given a dirty string. Traditional 'escaping' functions would convert dirty strings to clean ones, and crash when given a clean string. Having this be dynamic was more annoying than ahead-of-time compile errors, but it still did a pretty good job.

There's pretty much no excuse for stringly typed languages/libraries/etc. when such such trivial solutions exist, other than the historical inertia of legacy systems.


Web consists of strings, not types. Somewhere in your pipeline you have string-to-type, if you don't do that correctly you will either have data loss, injection or xss, true for every language.

It is true that some languages makes it easier to go string-to-type than others, but I can do all of that in PHP by creating my own types too.


Web consists of bytestreams, not strings. Somewhere in your pipeline you have bytestream-to-string, if you don't do that correctly you will either have data loss, injection or xss, true for every language.

It is true that some languages makes it easier to go bytestream-to-string than others, but I can do all of that in PHP by creating my own types too.

---

Web consists of bitstreams, not bytestreams. Somewhere in your pipeline you have bitstreams-to-bytestreams, if you don't do that correctly you will either have data loss, injection or xss, true for every language.

It is true that some languages makes it easier to go bitstreams-to-bytestreams than others, but I can do all of that in PHP by creating my own types too.

---

Web consists of voltage fluctuations, not bitstreams. Somewhere in your pipeline you have voltage-fluctuations-to-bitstreams, if you don't do that correctly you will either have data loss, injection or xss, true for every language.

It is true that some languages makes it easier to go voltage-fluctuations-to-bitstream than others, but I can do all of that in PHP by creating my own types too.

---

Web consists of excitations of the electromagnetic field, not voltage fluctuations. Somewhere in your pipeline you have excitations-of-the-electromagnetic-field-to-voltage-fluctuation, if you don't do that correctly you will either have data loss, injection or xss, true for every language.

It is true that some languages makes it easier to go excitations-of-the-electromagnetic-field-to-voltage-fluctuations than others, but I can do all of that in PHP by creating my own types too.

---

Web consists of entanglement of energy quanta, not excitations of the electromagnetic field. Somewhere in your pipeline you have entaglement-of-energy-quanta-to-excitations-of-the-electromagnetic-field, if you don't do that correctly you will either have data loss, injection or xss, true for every language.

It is true that some languages makes it easier to go entanglement-of-energy-quanta-to-excitations-of-the-electromagnetic-field than others, but I can do all of that in PHP by creating my own types too.

---

...


Nice to see that you agree with me that the web does not consist of proper types and you as a programmer must make that choice. You have your custom library that makes this happen and that is something you and your team has implemented.


Reminds me of the first couple of pages from SICP[1]:

  ``I think that it's extraordinarily important that we in computer science keep fun in computing. When it started out, it was an awful lot of fun. Of course, the paying customers got shafted every now and then, and after a while we began to take their complaints seriously. We began to feel as if we really were responsible for the successful, error-free perfect use of these machines. I don't think we are. I think we're responsible for stretching them, setting them off in new directions, and keeping fun in the house. I hope the field of computer science never loses its sense of fun. Above all, I hope we don't become missionaries. Don't feel as if you're Bible salesmen. The world has too many of those already. What you know about computing other people will learn. Don't feel as if the key to successful computing is only in your hands. What's in your hands, I think and hope, is intelligence: the ability to see the machine as more than when you were first led up to it, that you can make it more.''

[1] <https://mitpress.mit.edu/sites/default/files/sicp/index.html>


I like that. It also reminds me of Fred Brook's second essay in the Mythical Man-Month. He elucidates that SW engineer's optimism can often be an issue with schedule. Too often SW engineers don't carry the humility that they make mistakes and that they constantly expect fewer bugs exist than do by the time test time comes along.


Larry Wall, father of patch, Perl, and Raku has declared hubris to be one of the key virtues of a programmer, along with impatience and laziness.[0]. But he’s an astoundingly humble man, so what gives? The hubris that he talks about is really about the ability to always say “I can do better,” and then to actually follow through. The pride to let your good works speak for itself looks an awful lot like humility in the end.

[0]: http://threevirtues.com/


Such verbal economy. It's not just pride, it's excessive pride, to imagine you could write a system that others wouldn't complain about. He says so much about humane as programmers, humans as users, and the nature of programming in so few words.


I just posted this too! It's the same idea but one is presented as humility and one as hubris.


Larry Wall also highlighted the importance of: diligence, patience and humility.

https://www.oreilly.com/openbook/opensources/book/larry.html


Absolutely. The number one thing driving me to write better code is knowing that I will likely share it with the world, and that it should be presentable and clean as a baseline expectation.


Excellent observations. The essay illustrates what it is advocating by the generous clarity, simplicity, and accessibility with which it is written.

John Osterhout wrote what may be the best elaboration of this perspective in his wonderful book "A Philosophy of Software Design."

A couple of related thoughts from an old grizzled programmer (moi ;-), gregfjohnson.com):

Rule number one: All code must follow the Porthole Principle. The fundamental issue in programming is that we each look out at the world through a mental "porthole" that limits our field of view. We are limited in how much we can see and understand at any one time. Therefore, systems must be structured so that they can be understood completely, at all levels, even though we are only allowed to investigate them piecemeal, through our own limited and finite cognitive windows.

Abstraction is the essential tool that allows us to create systems of arbitrary size and complexity. A beautifully designed abstraction is easy to understand and use. It is so trustworthy that you don't feel any need to worry about how it is implemented. Finally, and most importantly, it enables you to reason with rigor and precision about the correctness of the code you are writing that makes use of it.


My rule of thumb is that 'the smartest code, is the code that you can work on in your dumbest moments'. Or, in a team, 'the most senior code, is the code where the most junior dev can easily work with'.

They may seem obvious. But in practice, far too often do I encounter code that is far too complex, and fails your porthole principle, and extremely hard to reason about, or work in, without worrying.

Now, when such code is made by an inexperienced dev, this is fine, and acceptable: finding the right abstractions, or even seeing the need for those, comes with experience. But when senior devs produce such poorly abstracted, hard to reason, complexities, it is inexcusable. It is your task to make complex problems simple. To make unreasonable domains reasonable. To apply the right abstractions in the right places.

To make code that you can work on when tired, distracted and stressed. To build structures where a junior can feel at home in, in hours.


Nice quote, but I would refine it a bit:

'The smartest code is the code that has your back in your dumbest moments and boosts your productivity in your best moments'


Then again, another form of humility is recognizing that the code you write yourself may also be hard for other people to understand, and code from other people may be harder for you to understand because of different programming styles, but you should still approach it with an open mind...


> Abstraction is the essential tool that allows us to create systems of arbitrary size and complexity. A beautifully designed abstraction is easy to understand and use. It is so trustworthy that you don't feel any need to worry about how it is implemented. Finally, and most importantly, it enables you to reason with rigor and precision about the correctness of the code you are writing that makes use of it.

Heh, I don't think there are a lot of proven abstractions out there. And most so-called "abstractions" are in fact not. Let me explain using two popular abstractions, ones that are so low-key that they wouldn't even considered by most.

1) Function calling. This is an abstraction that abstracts away the logistics of setting the state in a process in the right way such that the next piece of code can continue. When that code finishes, it will leave a well-defined state as well (first, in terms of the call stack, but maybe a return value as well).

Now, I contend that function calls can be the wrong abstraction in many situations, at least more often than people think, and many many functions seen in the wild should never have been created. Functions remove a lot of control where values are stored, and the storage locations can't be shared across functions, which results in a lot of nested calls that tunnel through many of the received arguments - instead of just leaving them in a common, predefined place. Also, lots and lots of functions in practice tend to amass local state, and as it is with the tree-shaped nature of function calls, once you give up control, that state is gone, so you'd better clean up after yourself. This is in fact a great burden, and very complicated systems arise to "solve" this problem, like constructors/destructors, try/catch, functional unintelligible academic theory (Monads), and other resource tracking systems.

2) Streams. In my mind, they are arguably one of the most successful abstractions ever created. A stream abstracts one of the endpoints of a unidirectional connection (the read or write endpoint). You use it by just saying "read" or "write", and very little of the complexity of interacting with that other endpoint shines through - lossyness of the connection, flow control, packet size, error handling... streams don't provide access to most of these.

This can be a very unhappy situation to the point where the code that deals with that stream would be much better off just dealing with the underlying connection directly. A huge aspect of this is flow control and scheduling - we mostly act like transmission was an atomic operation, but there is a lot of logistics involved. To hide this, OSes invented blocking interfaces, putting your process to sleep until the operation is completed, or providing simplistic non-blocking interfaces. All of this is very bad for performance and predictability, especially blocking interfaces.


This is perhaps going to be an unpopular sentiment, but I think far too much breath is wasted on the "don't be clever" edict. No examples even spring to mind of any past experience where I ran into someone's "too clever" code causing me headaches. It has been dealing with the mountains of "not the least bit clever" code that has sucked thousands of hours out of my career. Mundane, "straightforward" code where they've re-used variables for different purposes, or deeply nested conditionals with multiple, multiple booleans in each check (often redundant, if not contradictory) and generally taken 50 lines of code to accomplish what could be done more cleanly in 10 or fewer. I'll take puzzling a few minutes over some too clever code over slogging through spaghetti code any day.


From your description it feels less like an issue with the code not being clever enough and more like an issue with the code not being organized and architected efficiently.

I think the "don't be clever" edict applies to code segments that are best described as "you won't believe what happens next!", and fairly so.


imo unclever code != poorly designed / spaghetti code

Reusing variables in a way that is confusing is a code smell, and rather than being "unclever", I would characterize it more as just "bad".

In my mind, an example of code that is "too clever" looks more like this:

  while (*dest++ = *src++); 

Unless you've seen that exact pattern many times, when trying to understand it you will have to unwrap it in your mind into something that looks more like the longer, "unclever" version anyway.


I have a hunch that when we (the public) talk about humility in software development, we really mean humility _in the act of writing code_ but not strictly in the rest of the process.

Do the programmers that people look up to as role models (Torvalds, Jonathan Blow, Guido, Ken Thompson, Rob Pike, etc.) practice humility in the code they write? I would say yes, absolutely.

Do they practice humility in the rest of the software development process? I'm not so sure it is cut-and-dry in this case.

Outside of _writing code_, the software development process often leads to situations of "what is the right path to take?" which requires some form of leadership, and clear communication about some leader's own level of confidence in a given approach. It's a communication problem, and while practicing humility in this area often "sounds good" on paper - I think it often leads to death-by-committee.

Am I wrong? Have I misinterpreted what people mean when they describe practicing humility in software development?


I think there has been a difficulty for some to delineate between agreeable and humble.

Being humble does not mean you are passive and agreeable. It means that you can recognise you own fallibility and stand up to admit your mistakes and accept alternatives.


This resonates so much.

I love coding in Go because of the emphasis on simplicity.

Avoiding clever tricks seems counter-intuitive, but after decades of coding, I completely agree. They give me a buzz when I write them (part of my enjoyment of coding is from finding clever solutions to problems, after all), but they always bite me in the arse later.


It should be a blend of humility and pride. Humility in approaching problems and possibility of failure, pride in the final solution when it has been carefully and mindfully devised. Without being proud of your work, it’s all too easy to fall in the trap of churning out valueless stuff.


I know it's culturally controversial, but I think pride is a bad emotion. It's better than some, like anger or fear, but when you're prideful you're saying you're better than someone and then being worse than someone is just around the corner. A prideful man thinks that everything needs to be sorted by some concept of good. It doesn't. You can do good things because you care about others, instead of doing them because you want to be good. This distinction is important.


I disagree with this. I’d like to take a step back and even ask what a bad emotion really even means? That sounds a bit hand wavy.

I like to get endorphins. I like that the field I chose as a career can give me that when I feel like I did something well. I think an argument goes into pretty vague territory if one tries to argue that it’s more “good” when you get a nice feeling from helping others instead of feeling nice from your own work.


We know if an emotion is worse than another empirically. You'd rather feel joyful than ashamed, for example. You can aim for pride. That's fine. But there's better things. When you're prideful (self-inflating would be a good synonym) you're coming off as defensive. It begs the question why do you need that.

The distinction between the "goods" I was talking about is a question of whether you're motivated by that defensiveness, or some sense of lack, or if it's an act of caring, or an act of joy, or whatever. There's a world of difference between those approaches to action.


I think you're just debating semantics here really. The word 'pride' can be used to mean subtly different but related things, for example

a) pride in a job well done, which is what I believe the other commenters here are referring to, is the feeling of taking pleasure in successfully producing a well-made (something), whereas

b) pride in the sense of 'puffing oneself up' is holding and/or projecting an unrealistically high estimation of one's abilities, perhaps in an attempt to impress others - you could also refer to this as vanity

I don't see a problem with a); taking pleasure in doing quality work doesn't preclude one from seeing potential areas of improvement and it doesn't have to be pathological (telling everyone else repeatedly how good your work is, for example, which tends towards b) ), it's more like an intrinsic source of motivation and joy.


I agree. I am talking about that pride as in puffing oneself up.


You shouldn't be driven by pride, no, but you should still feel it. There is nothing wrong about being proud of helping others for example.


> There is nothing wrong about being proud of helping others for example.

I disagree. Pridefulness stays pridefulness irregardless of the context. Whether you puff up because you did something socially rewarding or not doesn't matter.

The other side of the coin with pride is shame. A prideful person might feel pride if he helps someone, and that's nice, because he's told himself that not helping is shameful, so he just went from shame to pride.

But pride is only good in relation to shame. If he had the choice, he'd choose to be happy about helping through empathy for example, rather than pride. It's best to escape the duality of pride and shame.

I'll put it another way. Would you prefer to do something out of shame, fear, lust, pride, courage, caring, love or joy? It's not all the same, is it?


> irregardless

Double negative in a single word. https://en.wikipedia.org/wiki/Irregardless

Interestingly the redundancy of Java is problematic for a similar reason that the redundancy of a double negative can actually reverse the meaning.


It seems we need to be distinct in pride as public vs. pride as private. In private, you are being proud of a thing you have done, it gives you good feeling and confidence, and inspiring you to go on to other works. It is positive and to build you up, not to put down another.

In public to be prideful, it is at expense of others, you put you above the other, and it is fueled by the external. It is negative energy sucked from outwards.


There isn't actually a distinction. In both cases it's the super-ego, the internal representation of "public", that's the ruleset for what's good and bad. Pride is about judgment (and self-judgment) by the super-ego. You could argue that if you're alone it's not destructive, but I don't believe that.


I liked the way Brent Simmons put it: since debugging is 10 times harder than writing code, write the code as you were 10 times dumber, otherwise you will not be able to fix it.


https://en.wikiquote.org/wiki/Brian_Kernighan

> Everyone knows that debugging is twice as hard as writing a program in the first place. So if you're as clever as you can be when you write it, how will you ever debug it?

From: https://en.wikipedia.org/wiki/The_Elements_of_Programming_St..., 2nd edition, 1978


I see. Brent’s blog was where I first read it but this is definitely older. Thanks.


Writing code is 10 times harder than debugging code if you write the code to be easy to debug. Partly because writing such code is harder and partly thanks to reducing the debug burden.



I thought it was from bwk.


Interesting, given Djikstra's 'reputed' arrogance. https://news.ycombinator.com/item?id=11796557


Dijkstra's speech is total and complete arrogance.

Djikstra is all "You need to get more humility dammit! You think you don't have to listen to me and do exactly what I say because you're smart but I am smart so I /know/ you're not! Be more humble! I'm right and you are not!"

You can interpret parts of it in ways that are reasonable. We do need to be humble in any engineering endeavor is a stunning glimpse of the obvious and hardly worth an ACM Turing award lecture. His fondness for simultaneously formally proving what you program have basically very rarely if not actually never been made to work in a useful way by anyone and he falls into the trap of blaming everyone else for this practice not taking off. Everyone else is too arrogant to just do what the great man says when it doesn't work.

Humility is a thing. I've just trashed Djikstra which is obviously a thing that must be done with humility... The humility of a random, semi-anonymous internet messsage board post is probably more humble than an ACM Turing award acceptance lecture. I'm a humble person with much to be humble about.


> Dijkstra's speech is total and complete arrogance.

and hence the quintessential quote

   arrogance in computer science is measured in nano-dijkstras

     - alan-kay


Here he is talking about humility in the act of writing code, by recognizing the limits of the minds capacity and therefore keeping the code simple to understand rather than clever.

He wasn't particularly humble in his writings.


Why would clever code be hard to use? Dijkstra talked about messy code, there is nothing wrong with clever code. Algorithms are very clever, but they are self contained and therefore easy to read and reason about and therefore not a problem. Trying to achieve the same things without being clever will just create a mess.


The article literally quotes Dijkstra for saying:

> The competent programmer is fully aware of the strictly limited size of his own skull; therefore he approaches the programming task in full humility, and among other things he avoids clever tricks like the plague.


I describe what I do in different ways, depending on who I'm talking to and how I feel about work. Sometimes, when I'm feeling good about things, I say "I make the internet," or "I tell computers what to do, and they do it." Other times, I say stuff like "I let a computer tell me I'm a fucking idiot for 8 hours a day," or, "I tell computers what to do, and they do it." :P

The truth is really somewhere in between the two extremes.

Another thing I often say is that most of the real hard problems in software development these days are social problems. What I mean by that is that you have to account for the characteristics and limitations of not only yourself, but the users of the software, the rest of your team, and your organization as a whole, when writing code or designing systems. In other words, don't get in over your head, make it usable, document what you've done, think about the consequences of what you're about to do (and write that down), and many other things. This is inherently a humble perspective, because, if you notice, you are the smallest thing that needs to be considered in all this.


Humility is extremely important. As a senior developer with over 15 years of experience, I'm tired of being lectured by junior developers with 5 years experience about things which I know to be incorrect because I used to think the same way but have since learned better.

If I try to tell people that some approach x is incorrect in this particular case because of reason y, they think I must be a dinosaur because all the articles they read online indicate that approach x is popular and therefore I must be wrong and lazy... As if I had been twiddling my thumbs for the past 15 years, when in fact I've been working non-stop nights, weekends, day job, open source side projects etc...

It's infuriating. I don't know what to say. Nowadays if I encounter such junior dev, I don't even try to start to correct them. Nothing can be done. We have reached peak intellect and things are going down. People will simply get dumber, unsophisticated black-and-white thinking will become more pervasive and I need to learn to live with that; sit quietly in meetings, smile, nod and cash my paycheck.


Rather than reading this short blog post read the underlying "ACM Turing Lecture 1972" by Dijkstra https://www.cs.utexas.edu/~EWD/transcriptions/EWD03xx/EWD340.... There is a lot more wisdom to it.


Humility is different from being submissive.

Humility is accepting you can be wrong, or what you do is suboptimal, etc.

Being submissive is conceding arguments even if you know you are right and you can prove it.

Companies are not democracies. Companies claim to be meritocracies but are not. Companies are ultimately governed by authority. Authority defines what is truth and what is not: authoritative truth.

Each authoritative truth is a fork from reality, and is in a way, a form of fiction.

Authoritative truth can go against logic, applied science, empirical evidence, common sense, ethics and morality. It does not have to be correct, authority makes it correct.

Because of this, engineering and authority are completely opposite things.

An authority with humility will try to lead the team towards understanding things from first principles. An authority without humility will be creating and expanding on authoritative truth.


I think that humility is important in all endeavors, not just software development. I know a lot of people who seem to think that expertise on one area somehow magically transfers to other areas. Just because you’re smart or good at <insert computer skill here> does not mean that you automatically will be able to accurately judge <insert non computer related issue here>.

And expertise can be incredibly narrow- when dealing with complex systems and interrelationships between such systems, it’s really easy to accidentally encounter problems that you might not have expertise in; in fact you might not even be prepared to even recognize that you’re out of your depth.


(2020), but timeless.

If you like this post, you might also like reading the relatively short book, A Philosophy of Software Design by John Ousterhout, or the talk you'll find on YouTube by the same name, which covers roughly half the topics in the book.


It is also important to be extremely arrogant and not know your limitations in the sense of Donald Knuth: Had he known his limitations and the time it will take he would never have started Tex or TAOCP, in his own words.

Non knowing my limitations was essential for me as well. When I was a kid I saw a world full of possibilities and I could do much better than anybody else.

It was not that easy, it was painful and I needed help for getting things done. But if I had not been the arrogant bastard I was I would have never started the things that later finished for pride. I would also had not improved my skills in the way that I did because I had to give what I promised.


Maybe not one to practice what he preached; as Alan Kay observed, arrogance in computer science is measured in nano-dijkstras.


Indeed, I was also surprised by the provenance of that quote. See:

https://medium.com/@acidflask/this-guys-arrogance-takes-your...


I'm not seeing much evidence of Dijkstra being unbelievably arrogant in those letters.

This mostly seems to be two stuck-up academics caught up in sniping (very cordially) at each other over petty academic crap.

EDIT: Okay, I've read EWD692 and I get why Backus was pissed now. This still feels a lot milder than people are suggesting.


Note that Backus's complaint is in relation to EWD638, where Dijkstra tears apart every claim made in a paper and accuses the authors of having a "pre-scientific attitude" and giving "the impression of anti-intellectualistic reactionaries". But none of this explains why the "provenance" of Alan Kay's statement about Dijkstra's arrogance is supplied in a retelling of Backus's statement about Dijkstra's arrogance. The provenance of Alan Kay's statement is that Alan Kay said it, in his OOPSLA keynote.


Did anyone else find it a bit ironic that the person talking about the importance of humility has a large "Microsoft MVP" logo on his blog?

Doesn't take away from the validity of his points, but it made me chuckle a bit.


The Humility from the article is not meant in the social context, but technical.

It is about understanding how well we can reason about code, not about how humble we must present ourselves.

The fact many commenters here talk about the social humility, makes me believe many hn readers have read the article (let alone the therein linked articles) poorly or not at all.


I think you can not so easily decouple "technical" and "social" humility.

Dijkstra's advice/definition of humility was that we should be aware of our own limitations when programming. That is both a "technical" as well as "social" construct, for example to be aware of your own technical limitations is incompatible with saying "I am the best programmer in the world", or "I understand the most complex code", because it demonstrates an unawareness of your technical limitations IMO.

However, my observation was largely a unrelated anecdote on the wording and not a critique of the author or the message.


Thinking that you can create better abstractions than your predecessors isn't technical humility either. And neither is working hard to streamline processes "laziness". Those words are used to get people to click the link, not because they actually are relevant.


Personally I'd find that embarrassing. But whatever floats your boat, I guess.


I recall the retelling of a startup interviewee comment who tanked their opportunity by saying "the salary: make it a big number."

Furthermore, I notice in clinical healthcare and software engineering that ego tends to be inversely proportional to capabilities because the jerk reaches hubris by stopping learning and assuming they're always right, leading to less knowledge, career development, feedback, and authentic peer interactions. Eventually, they become the "I've been doing this for X years" people. They become infinitely awesome, but in their own minds only.


I think a common issue with cargo-cult technologies/languages/frameworks is that although the ultimate benefit might be great, there is often a significant cost to get there that makes it not worth it for some people/companies.

For example, is Go a great language? No doubt. Is it worth ditching a load of code we already have and take the time to learn how to do it well? Not necessarily. Are microservices cool? Absolutely. Should everyone use them? Definitely not.

People who see "Go is great" and immediately start down that path do not understand that context is everything.


I think an extended conclusion to draw, which is worth articulating rather than leaving off at a vague notion of humility, is to (try your best to) account for all of our intellectual limitations in the design of the systems that we build.

None of us remembers particularly well. No one can run all of the code in their head. The future person who has yet to join your team doesn’t even get the chance to “remember” the reasoning for the decisions that we make today.


We can start by thinking of software as the tool, rather than the product. We tend to pride ourselves on the software we create, rather than priding ourselves on the problem we have solved. We have pushed the concept of tool down.

So, what I mean is this, we think of jQuery as the tool and the website as the product. Or Angular as the tool. Insert library.

This keeps us in a hamster wheel of learning to use tools to build products, rather than building products to solve problems.

The software is not the goal. The solution is the goal.

I see this as a human issue in lots of fields. Carpenters love to debate dewalt vs makita vs milwaukee, but it's the thing built with the tool that matters, not the tool.

Imagine carpenters striving to learn how to use different brands of circular saw. We debate angular vs react vs jquery. Why do we care about that?

Because that is about us rather than the product. I know jQuery. I know angular. Angular is better than react, therefore I am better than you.

That is the opposite of humility. That is arrogance. We are stuck in a loop of solving the problem of solving problems. We need to get to the next level.

I see it now with Canvas vs DOM.


Nobody gets promoted for being humble, rather pushed out of a company for a lack of ambition. Everybody loves energetic extroverts that could argue well and with proper tunnel vision to skip thinking about potential problems if it helps the bottom line immediately.


I read this advice as being humble when coding as in not assuming that you got everything right the first time - in other words, test the hell out of everything, even if you're sure it's right. Then, when you have tested it inside and out, you can be as confident face-to-face that you did get it right.


The biggest challenge here I think is that we don't have an objective definition of clever code, and if you ask, most people will just try to retroactively justify why the current mainstream way of writing things is good and not at all clever. If you do something unusual, people think you're trying to be clever.

I think that a lot of the stuff people take for granted in modern programming languages would've been considered clever tricks or just complex and alien mechanisms by the average programmer around when I started 25 years ago (remember serious business that ran on basic?).

The way mainstream code looks today has changed a lot compared to then, and I predict it will still change a lot.


The importance of humility in software development? Very little.

Hubris and flying too close to the sun is what has always pushed tech forward and turned average software developers into legendary ones, both for their success and for their failures.


Audio of the mentioned 1972 ACM Turing Award lecture by Edsger W. Dijkstra : https://youtu.be/0dGXRK8FUVg?t=148

Transcript : https://www.cs.utexas.edu/~EWD/transcriptions/EWD03xx/EWD340...


Humility isn't important, a an accurate assessment of your capabilities is important. A good assessment of yourself isn't humility.

Dijkstra wrote a lot of "deep but not really" quotes that makes perfect headlines and generates clicks and traffic for your blog. Doesn't make them good advice. His full articles are better but people just use the short quotes and writes blogs based on those.


If I'd wanted to bring a thing that modern software development needs right now. I'd say it's optimizations. But, unfortunately, so many companies, big & small, disregard this critical step because of the insane performance that comes from modern hardware. I guess the gaming industry is the most affected and the one where these issues are most easy to notice.


Time spent optimizing is time spent not adding features. /s

The "business value" of software optimization is not well known.


I wonder if computing resources peak, which I think we are at now with hardware manufacturing shortages and price explosion (GPUs, HDDs, SSDs), is going to change this perspective.


BTW came across this in some other reading today: https://mechanical-sympathy.blogspot.com/2011/07/why-mechani...


lol - people were saying this in the 80's yet software has shown it can always outstrip the hardware resources thrown at it if one is not careful :)


Humility is important for all teamwork. And not just humility about the technial task at hand but in general.


It is balance act in social aspect. Humility makes other people feel good about you on emotional level. But, if you dont display confidence and pride too, you will be effectively punished.

People like humble people, but don't think they are as good as people who act confident or even arrogant.


Dijkstra also said

For a number of years I have been familiar with the observation that the quality of programmers is a decreasing function of the density of go to statements in the programs they produce.

Not so humble.


This post fits the definition of hubris under the three virtues[1].

[1] http://threevirtues.com/


Humility also helps push you to measure things and assume less. And lack of humility can make you trust that your code just works and not test it as thoroughly


/s/lack of humility/overconfidence

So is humility underconfidence ?

Is their a word for the right amount of confidence ? Maybe confidence ?


This article feels like it's been written by GPT.


My problem is that mostly I see "abstraction" used as a gateway to introduce "clever tricks" instead of making things easier.


> Let me be clear. I’m not trying to reinforce impostor syndrome.

No, it's just that non-trivial efforts tend to be heuristic in nature.


didnt realize Dijkstra was a language troll xD


Money rules software no less than any other industry. Sometimes I think the hubris of software is meritocracy and efficacy rules software. Sure... Software is prone to the tower of Babel, not invented here, tribalism, and greed that permeates all human endeavors. There are islands of productivty just like any other capitalist domain. Software is not special in its place in human endeavors but its practioners like to think they are beyond the mundane aspects of our nature. At times it is cute, but mostly just droll.


You can be humble only when you're competent and you know it. Then you can make a choice. If you barely have the skill to somehow put stuff together so it kinda works then there's no place for such subtleties. So I'd rather have a skilled but showing off programmer than a humble untalented one


I wouldn't. A humble, untalented (I'd rather say "unskilled" here) programmer is one who knows they're unskilled and wants to learn. I'll take someone who knows they have a lot to learn over someone who thinks they already know it all, any day.


But a skilled programmer knows how to assimilate a new code base. Clearly they aren’t going to claim to know the new code base before looking at it (so they aren’t going to claim to “know it all”)


Skilled programmer has the proficiency and courage to attack the problem and win. There's some boldness coming from knowledge and experience, and i like people showing that. On the other hand an unskilled person will not be able to understand the design, will be afraid to make changes, will get confused and ignore the parts they cant understand, and will not take the responsibility and initiative - they need to be guided all the time. Then i dont care if they're humble or not, there's nothing to be gained.


Yeah incompetence is worse than bragging and humble bragging.

The issue mostly arises because Thinkers are prone to expressing confidence while accepting of criticism. But more people (feelers) are humble yet violently opposed to criticism.

But yeah, it’s good to not unnecessarily crush incompetent egos when it can be avoided... unfortunately some people are just too sensitive and even not encouraging them is seen as an attack on them.

By the way, I was agreeing with you.


My ego is crushed anyway


how is life in management ?


Most of unskilled programmers i met did not become much better after years. They kinda reached their max and stayed there or got into management. So I wouldn't count on willingness to learn, the capability is the key




Consider applying for YC's Spring batch! Applications are open till Feb 11.

Guidelines | FAQ | Lists | API | Security | Legal | Apply to YC | Contact

Search: