TE
TechEcho
Home24h TopNewestBestAskShowJobs
GitHubTwitter
Home

TechEcho

A tech news platform built with Next.js, providing global tech news and discussions.

GitHubTwitter

Home

HomeNewestBestAskShowJobs

Resources

HackerNews APIOriginal HackerNewsNext.js

© 2025 TechEcho. All rights reserved.

Software Complexity Is Killing Us

398 pointsby Tenhundfeldover 7 years ago

48 comments

whackover 7 years ago
To me, this was the money quote:<p>&gt; <i>You might say, “But event sourcing is so elegant! Having a SPA on top of microservices is so clean!” Sure, it can be, but not when you’re the person writing all ten microservices. It is that kind of additional complexity that is often so unnecessary.</i><p>It&#x27;s very easy to be wasteful when:<p>1. It&#x27;s not your time that&#x27;s being wasted<p>2. It&#x27;s not your money that&#x27;s being wasted<p>One of the best learning experiences I had, was building and launching an entire application API, purely by myself, in my free-time while juggling a full-time job. It really helps you accurately evaluate the cost-benefit tradeoffs for various flavor-of-the-month technologies&#x2F;methodologies, when you&#x27;re the one who has to shoulder every one of those costs.<p>I&#x27;ve had far too many team-leads whose assessments of these cost-benefit tradeoffs are intensely skewed by the fact that it&#x27;s other people who have to work on those things, and it&#x27;s other people&#x27;s money that is being burnt while working on these things. We think these are technical debates, but really, it&#x27;s a organizational problem. Under the right organizational structure and incentives, people are exceedingly bright at optimizing for their personal success. The principal-agent problem is a crippling handicap that hobbles every medium&#x2F;large business today. The day we find better ways to solve this problem, is going to be a transformational day in the history of our civilization.<p><a href="https:&#x2F;&#x2F;en.wikipedia.org&#x2F;wiki&#x2F;Principal–agent_problem" rel="nofollow">https:&#x2F;&#x2F;en.wikipedia.org&#x2F;wiki&#x2F;Principal–agent_problem</a>
评论 #16262539 未加载
评论 #16261187 未加载
评论 #16261433 未加载
评论 #16261248 未加载
评论 #16261640 未加载
评论 #16261468 未加载
评论 #16271856 未加载
评论 #16263610 未加载
blunteover 7 years ago
Blah <i>bullshit</i> blah.<p>The reason software is so complex now is that our expectations as users is orders of magnitude higher than it was &quot;in the good old days&quot;. I&#x27;m old enough to remember the good old days, so I can speak with a little authority here.<p>The Pareto principle may not be exactly accurate, but it describes many situations quite well. And in software, it fits very well. 80% of the requirements take about 20% of the code (and complexity). It&#x27;s the edge and special cases that add the bulk of the work.<p>When a program just did one useful thing, we humans would do our human thing and integrate several different programs with our manual effort. If an edge case appeared, we didn&#x27;t even identify it as an edge case - we&#x27;re built for handling edge cases! We just made the minor _human_ judgement and fixed the data and pushed it into the next program.<p>Software is complex because we&#x27;re trying to make it replace more human activity. And beyond the core functionality, human activity is all about applying human judgement. If anyone is familiar with people training people on a particular task, particularly the quaint concept of apprenticeship, it involves teaching and showing and mentoring until a student has enough knowledge AND wisdom to get the job done.<p>So to boil it down, modern software is primarily complex because it attempts to replicate human judgement and wisdom.<p>That software complexity is not killing us. It may be a pain in the ass, but if anyone can remember what it was like before we had these tools, I would dare to say that it&#x27;s still a whole lot better than before computers.
评论 #16261162 未加载
评论 #16260911 未加载
评论 #16261510 未加载
评论 #16261230 未加载
评论 #16261784 未加载
评论 #16261622 未加载
评论 #16260874 未加载
评论 #16261938 未加载
评论 #16261490 未加载
评论 #16261566 未加载
评论 #16261441 未加载
评论 #16263854 未加载
评论 #16261445 未加载
nulagrithomover 7 years ago
The company I&#x27;m at now has been building the &quot;most simple&quot;, &quot;low-code&quot; solutions they can find for 15 years.<p>We&#x27;re constantly talking about the Pareto principle: &quot;80% of software can be written in 20% of the time.&quot; And we optimize for building that 20% of the code in the simplest, fastest way possible.<p>The problem is the other 80% of the code, the part that accounts for 20% of the features, ends up being necessary before full adoption of the software takes place. 80% working simply isn&#x27;t good enough. But since we&#x27;ve optimized for that easy 20% using low-code solutions, the other 80% of our code ends up being twice as painful. We end up deciding it&#x27;s too expensive to continue and attempt to force use of the 80%-finished software as-is. Historically, this hasn&#x27;t turned out well for us, and users end up compensating via spreadsheets or even <i>paper</i>.<p>It takes a couple years for this whole process to play out. The project is often declared a success since 80% of it got done and deployed so quickly. But there&#x27;s always those last nagging bits that, upon further inspection, have led to the app&#x2F;feature&#x2F;whatever being abandoned later on.<p>&gt; It is that kind of thought process and default overhead that is leading companies to conclude that software development is just too expensive.<p>It <i>is</i> too expensive for them. If you&#x27;re building a house and get sticker-shock at the cost of building the foundation, maybe you&#x27;re in too deep.<p>Please don&#x27;t skimp on the foundation.
评论 #16264295 未加载
评论 #16263434 未加载
whistlerbrkover 7 years ago
I don&#x27;t get this article, the author identifies the issue immediately:<p>&gt; in the process, we often lose sight of the business problems being solved<p>And then goes on tangents as to why that is happening finally arriving on what tantamounts to &quot;developers don&#x27;t like to use visual UI tools&quot;.<p>The original cause identified is right, people lose sight of business goals, but why? Because they have poor project management and they are in the trenches all day long. They want to do right by the code base, so they abstract things which don&#x27;t need to be abstracted. The failure here is one of trade off analysis and again losing sight of what is important, shipping a usable product which meets business goals.
评论 #16260835 未加载
评论 #16260886 未加载
评论 #16262150 未加载
forg0t_usernameover 7 years ago
The irony is palpable here... The website loads slowly, elements move around the page during the first load, then the fonts blink around and go from system font to some custom font. It loads data from 15 different domains, and four of those are only for tracking.
评论 #16260814 未加载
评论 #16260788 未加载
评论 #16260761 未加载
评论 #16260844 未加载
评论 #16260756 未加载
sloxyover 7 years ago
I also think it should be noted that compromise between designers &amp; developers &amp; business domain experts (seemingly now called &#x27;product managers) could vastly simplify all this.<p>The more empowered a developer is to over-ride a designer&#x2F;biz person&#x27;s preference[1], the better it is for all.<p>Way too often, I see developers just accept what the product manager&#x2F;designer specifies with zero pushback when it strays outside what could be considered the &#x27;norm&#x27; for whatever tech stack is in play.<p>[1] I use the word preference because that is all it is - their preference. They don&#x27;t have a magic ball.<p>Sidenote: I&#x27;m also seeing a rise in UX suddenly becoming owned by the UI &amp; product management team which is bizarre. You have designers(whether from print backgrounds or whatever) making poor(&amp; I mean piss poor) UX decisions because they don&#x27;t have the exposure&#x2F;understanding of web platforms. Case in point: if your UX person has a calendar widget to enter a date of birth, they should no longer be allowed do UX.<p>&#x2F;rant
评论 #16262302 未加载
评论 #16261200 未加载
评论 #16261076 未加载
评论 #16261880 未加载
评论 #16262653 未加载
zitterbewegungover 7 years ago
I totally agree with the article. I would like to add that it is also the fact that as a culture we stress features over bugs.<p>Everyone says that security&#x2F;logic bugs&#x2F; invalid data is a problem. I haven&#x27;t worked for anyone that prioritizes security and bug fixing over features. As we gain more and more time in a product and with deadlines that don&#x27;t make sense we basically get a whole pile of code that is unable to be tested in any amount of time given.
评论 #16260878 未加载
评论 #16261024 未加载
评论 #16260861 未加载
vinceguidryover 7 years ago
I stopped being concerned about this specifically a couple of years ago. Complex software does not need to be refactored, it needs to be rewritten. The important thing that the legacy software does is firm up the domain. With the concepts and language set, rewriting to encapsulate new semantics is relatively easy. It&#x27;s when you have no idea what the domain is going to look like where it&#x27;s hard, and that makes for complex, quickly-becoming-legacy code.
评论 #16260854 未加载
评论 #16260850 未加载
GVIrishover 7 years ago
I think there are a couple of different problems driving overly complex software.<p>1. Cargo-culting. The article talks about this, but one thing I&#x27;ve seen consistently over the years is that something new comes along, and people latch onto it like it&#x27;s the solution for every problem, everywhere and you&#x27;re stupid or outdated for not thinking the same. It&#x27;s the whole, &quot;RDBMS&#x27;s are dead!&quot; thing.<p>2. Shiny-new-thingism. This is slightly different than cargo-culting in that people don&#x27;t necessarily think the new tech is the ONLY way to do things, it&#x27;s just that people want to use something new because it&#x27;s hot. Then people get deeper into it and realize that there are some unknown unknowns that bite them in the ass. This becomes more likely the more abstracted things are, and&#x2F;or the more moving parts there are. It&#x27;s not that old technology doesn&#x27;t have that problem too, but there are more charred carcasses of other people&#x27;s failures to learn from.<p>The other thing is, as a developer there is a strong urge to try to use new tech because &#x27;hot tech&#x27; = &#x27;higher pay&#x27;.<p>3. The business requirements were not well-understood when the project was started (and may still not be well understood). Sometimes you&#x27;re told to start building X, but you find out over time you really should have been building Y, while the customer asks for Z (no wait, W!) and you never get the time to pay off that technical debt. This is probably the hardest problem to address and is a large reason agile caught on.<p>4. Bad software architecture. Maybe you inherit software that has a crapload of technical debt because of point #3, or maybe it&#x27;s because the previous team made some really bad design decisions from the get-go due to incompetence&#x2F;inexperience. So then your choice becomes, do you tear it all down and start over, or do you limp along and add to the skyscraper made of popsicle sticks and bailing wire? Oh, and there&#x27;s no requirements!<p>So you&#x27;re left performing software archaeology like Indiana Jones, trying to figure what it was that a previous civilization was trying to do. Then you have the horror movie moment where you realize, &quot;This...never worked, it was wrong all along...&quot;
评论 #16265463 未加载
titzerover 7 years ago
The only way out of this box, IMHO is proper layering of software and proper interfaces. Human brains have a limited capacity to manage complexity. There is only so much you can fit into your head at one time. (I dunno, maybe it&#x27;s just me, but I&#x27;ve been around long enough to have hit this limit repeatedly, and started forgetting about code I have written in the past).<p>To combat this, humans require abstraction. A proper abstraction fully encapsulates the implementation details and provides an interface that does not require knowledge of the details behind the abstraction.<p>We have too many leaky abstractions. Bugs, performance issues, brittle software broken by updates. Language features that break in complex ways when users make mistakes (hello C&#x2F;C++!) A leaky abstraction lets its details spill out through the backdoor. These cause cognitive load and make it impossible to layer software properly.<p>The only way to build a big system is proper abstractions.<p>Until Spectre and Meltdown, ISAs were good abstraction layers.<p>Today, still, my personal opinion is that the kernel system call layer is one of the strongest abstraction boundaries that we managed to enforce. Above this layer, it&#x27;s all a mess. Below this layer, it&#x27;s all a mess. (To a first approximation).<p>We aren&#x27;t getting anywhere until we get the layers right.
Meaiover 7 years ago
I think the culprit are the programming languages, they offer all these features that allow complexity. If you allow it, people use it. It sounds like an oversimplification of the problem but I honestly think that&#x27;s the entire problem summed up. The second layer are all the legacy layers that we build up on. Nothing can be done quickly about it but as soon as you make a better language, people seem to almost instinctively jump at fixing the legacy layers too. People write an entire OS in Rust and Rust isnt even simple. We just need a simple, fast and safe replacement for C and I believe all the messed up parts about software would get fixed very fast.
评论 #16260951 未加载
评论 #16260870 未加载
评论 #16260840 未加载
评论 #16260910 未加载
评论 #16260776 未加载
iamleppertover 7 years ago
Lack of architecture is to blame, and poor design. I&#x27;m sorry to say after having worked in software professionally for over 10 years, that most people just suck at any kind of reasonable design or architecture. You can attribute it to lack of experience, incompetence, or lack of care, whatever, but most people are just bad.<p>The only metric an engineer should be judged by is: do they make everyone around them better? How quickly can a new developer come up to speed in their codebase and make meaningful contributions? It&#x27;s okay to start out slow, but in my experience the #1 sign of a bad engineer is someone who gets slower over time. If the costs to implement a feature are increasing, not decreasing, you need to take a hard look at your team and what kind of hot mess people you are really working with. If you&#x27;re in a position of power, that might involve letting people go, and worse, if you&#x27;re just an engineer, that might mean finding a new job yourself.
评论 #16263970 未加载
Yhippaover 7 years ago
Shout out to my homies in RVA.<p>There are so many complications to this issue. I imagine a long time ago things were less complex and more manageable. As you build layer upon layer of new tooling on top of the past I feel things were just naturally going to get complex and unmanageable. It&#x27;s almost like for us to have avoided this we would need some programming paradigm that stands the test of time and is flexible enough to meet today&#x27;s needs. Which is probably impossible.<p>Unless we are in the Cambrian explosion of tooling and frameworks and at some point we will achieve a steady state. That would be really cool to see in my lifetime. Every time I think &quot;ah yes, this should be good enough&quot; I am blindsided by the new shiny.<p>That&#x27;s also a separate topic. There&#x27;s plenty of incentive to use the new shiny if it&#x27;s not the right tool for the job. Tech gets hyped by the usual engines, CTO&#x27;s buy into it, and then that&#x27;s our tech stack. You need to have these new frameworks on your resume to become employable so when you start a new project you end up using one of them.<p>I don&#x27;t know what the solution to this is other than the hope that there&#x27;s some general building blocks or concepts of software development that will be easy to make work with other building blocks.
jonduboisover 7 years ago
Software companies these days are ridiculously inefficient.<p>Unfortunately, this is because the logic that goes on in peoples&#x27; heads when it comes to selecting tech stacks often boils down to this:<p>1. x newer than y.<p>2. The company which created x has more money than the company which created y.<p>Therefore x is better than y.<p>Q.E.D. Now, let&#x27;s immediately refactor all our company&#x27;s code to use x.<p>Complexity and relevance to the task are not a factors at all. That&#x27;s because big software companies don&#x27;t need to be efficient - They usually have a monopoly so the money will keep coming no matter what... Complexity is a tool that middle-managers use to create more work so that they can hire more people and thus get more responsibilities and bigger bonuses.<p>If all tech decisions where made by non-technical people using the 2-point criteria mentioned above, companies would be using exactly the same tech stacks as they are using today.<p>Developers today are geniuses when it comes to using stacks in ways that they were never intended but they are absolutely terrible when it comes to selecting the right stacks for the job to begin with.
noxecanexxover 7 years ago
One thing I am yet to see is a critical analysis of over-engineering. I constantly see articles like this that talk about how those young developers are looking for the newest and shiniest technology and I think that&#x27;s just a lazy answer to the causes of over engineering. I for instance have tried my best to run away specifically from the new shiniest things like Kafka, webpack, mongo. But this is obviously a flawed strategy as those technogolies my help solve my problems. One might say careful cost&#x2F;benefit analysis is the answer but it&#x27;s most times easy for me to point out how much more beneficial the tech I am introducing is. And it could be but it would still be over engineering. Plus it&#x27;s not really solving the real problem that is adding more incidental complexity to the solution than needed. It would interesting to see an article on causes of over-engineering from real examples so one could extract potential solutions.
评论 #16261991 未加载
评论 #16269052 未加载
评论 #16262730 未加载
space_fountainover 7 years ago
Hopefully I&#x27;m not in the minority when I say there&#x27;s another side to this too though.<p>Working now at my first job I can&#x27;t tell you how annoying it is to try to update ancient php with essentially no code reuse. Sure it&#x27;s simple, but basically unmaintainable.<p>Also from the same job, but I continue to work hard to try to convince others that using prepared statements is worth the slight extra effort. If I hadn&#x27;t made it significantly easier it would never get used at all and we&#x27;d see way more string appending
评论 #16260985 未加载
评论 #16260818 未加载
评论 #16261009 未加载
trhwayover 7 years ago
&gt;Well, a few things. First is that experienced developers often hate these tools. Most Serious Developers™ like to write Real Software™ with Real Code™.<p>&quot;experienced&quot; is the key here. With most of these tools you develop 90% functionality very fast, and there is no sane way to develop the rest 10%. The hacky&#x2F;ugly&#x2F;umnaintaneable ways you go to add those 10% into the beautiful tower that the tool built for the 90% ... You become very &quot;Serious Developers™&quot; after doing it several times and noticing the &quot;pattern&quot;. And it helps that with time you are also becoming much better with the Real Code™.
评论 #16261067 未加载
评论 #16260617 未加载
评论 #16260790 未加载
tomc1985over 7 years ago
&gt; A lot of developers right now seem to be so obsessed with the technical wizardry of it all that they can’t step back and ask themselves if any of this is really needed.<p>&quot;Can we? <i>Should we?</i>&quot; &lt;--- something NOBODY in tech seems to ask any more<p>Developers need to learn to <i>go with the flow</i>. Very often a platform or toolset makes a specific technique or manner of working easier than the others, but that option might be discarded by the implementer because it doesn&#x27;t strike their fancy. Fuck your fancy, go with the god damn flow!
评论 #16262723 未加载
jiaweihliover 7 years ago
This can really cut both ways, and moderation is key.<p>I&#x27;ve seen software that&#x27;s extremely overengineered. Something like ~15 microservices with data (for the same model) split across both Mongo and Redis, spun up via Docker configs hosted on Google Kubernetes Engine. Run by 1 person for a product with low (&lt;1k DAU) traffic.<p>On the other hand, I&#x27;ve also seen software that&#x27;s extremely _underengineered_. And that might not be a disjoint set. The same stack I mentioned above implemented an in-house search, task&#x2F;message queue, deploy system, URL shortener, and mobile notification service - all with a more restricted and buggier API compared to more popular commercial &#x2F; open-source offerings.<p>It&#x27;s highly important to choose your areas of competence. What systems need to be better in X vs. off-the-shelf alternatives? And can you afford to dedicate time and money (through development and maintenance) to support it?<p>===<p>I&#x27;m going to state a likely unpopular opinion now, and advocate that most typical SAAS &#x2F; CRUD projects start with Rails, and build from there. I say that because there are many, many well-maintained and battle-tested libraries that have already been vetted in that ecosystem, and the community&#x27;s mantra is to optimize for engineering productivity (GSD and communication with other engineers) and happiness. There are libraries to set up an ingest pipeline [1], or a pooled background task system [2], or whatever other complex systems you need to build. But when you&#x27;re just getting started, you want to set up an API with some validations against business logic, and ActiveRecord and Rails(-api) gets you pretty far very quickly for just that.<p>Another related unpopular opinion I hold is to avoid Node, unless you have a specific reason to use it. Yes, it&#x27;s new and flashy, but the cost of that is that the ecosystem hasn&#x27;t matured and tooling you&#x27;d expect doesn&#x27;t yet exist. That&#x27;s not to say that every new technology should be avoided. I think of it as investing in a sense - you need to place your bets correctly based on research like community, maturity, functionality, and possibly most importantly: how it compares to existing tools (and their trajectories).<p>[1] <a href="http:&#x2F;&#x2F;shrinerb.com&#x2F;rdoc&#x2F;files&#x2F;README_md.html#label-Direct+uploads" rel="nofollow">http:&#x2F;&#x2F;shrinerb.com&#x2F;rdoc&#x2F;files&#x2F;README_md.html#label-Direct+u...</a><p>[2] <a href="https:&#x2F;&#x2F;github.com&#x2F;mperham&#x2F;sidekiq" rel="nofollow">https:&#x2F;&#x2F;github.com&#x2F;mperham&#x2F;sidekiq</a>
评论 #16261395 未加载
jeffdavisover 7 years ago
This article is about the complexity of software <i>development</i>.<p>The complexity of software itself (and hardware, as we have seen recently) is a much bigger problem.<p>More and more machines are playing a larger role in our lives and decisions; but we don&#x27;t come close to understanding them. In about a decade, things will just &quot;happen&quot; with no clear cause (the actual cause being some emergent behavior of out complex systems), and we will revert to pre-enlightenment mystics and superstitions.
ynnivover 7 years ago
Step 1: Solve the problem with the most mature technology that is commonly used for that problem<p>Step 2: Fight the urge to use something newer
评论 #16261022 未加载
weberc2over 7 years ago
&gt; Much of this reduction has been accomplished by making programming languages more expressive. Languages such as Python, Ruby, or JavaScript can take as little as one third as much code as C in order to implement similar functionality. C gave us similar advantages over writing in assembler. Looking forward to the future, it is unlikely that language design will give us the same kinds of improvements we have seen over the last few decades.<p>I have lots of hope for language improvements (specifically type system improvements) to help manage software complexity. Generics marked a significant improvement over C or Java 1.0 styles of development. First-class sum types means I don&#x27;t have to think about how to implement them as a pattern and weigh the tradeoffs or make sure all of my conditionals cover every scenario. Rust&#x27;s memory model uses types to give strong correctness guarantees, and is currently probably the best way to write software when a GC simply won&#x27;t do. TypeScript and MyPy employ gradual typing to help developers get the best of both dynamic and static typing. I suspect that there are a lot of ideas coming out of type theory that just need a good path from academia and into real-world practice.
jaydensericover 7 years ago
The main problem is the environments we have to code in are garbage; the simplest solutions to complexity are often standardized at the language&#x2F;environment level but implementations are years late.<p>There is more money in building products and coming up with workarounds than there is in improving the environments we all have to work with. There are also too few smart people in the world available to keep up with demand for both activities.<p>Instead of 10 people keeping IE up to date with modern JS language features, we had millions of people people trying to come up with and use genius solutions (Babel anyone?) to transpile and polyfill their code backwards. Instead of 4 people adding support for ES Modules to Node.js years ago, we have have many thousands of people trying to work out WTF to do on their own.<p>The solution is not to freeze technology in its currently deficient state and to be content, that attitude on behalf of environment maintainers is how we ended up here in the first place!<p>JS will be &quot;mature&quot; and infinitely more productive once basics like modules are implemented in all servers and clients. It will get better eventually.
评论 #16262717 未加载
rmrfrmrfover 7 years ago
There&#x27;s so much bias in these articles. In Javaland, JSP, Spring, OSGi, and servlet containers all introduce massive amounts of complexity, yet are ignored by &quot;real engineers&quot; in favor of (inexplicably) bashing Kafka and Redux.<p>Stop labeling something &quot;complex&quot; just because you&#x27;re unfamiliar or uncomfortable with it.
darioushover 7 years ago
The amount of boilerplate and number of different technologies you need to tie together to have a polished, presentable project with possibility for end-user traction is insane.<p>You&#x27;re going to want two different mobile apps (or a cross-platform solution). You&#x27;re going to need a whole bunch of widget and formatting libraries.<p>You&#x27;re going to want a bunch of tie ins with authentication providers.<p>You&#x27;re going to want some form of social media integration.<p>You&#x27;re going to want a back-end served on a cloud.<p>If you&#x27;re pushing it you&#x27;ll still want a website. Which of course comes with it&#x27;s own myriad of CSS and JS frameworks.<p>Compare this to the simpler days of the where all you needed was a mostly static HTML page with some PHP and you could plop it on a server via FTP and viola you were in business.
cmcgintyover 7 years ago
Agreeing with other posts that this is mostly bullshit. Software is complex because every project is constrained by limited resources. There is no perfect language to develop in. There is no perfect framework or platform to create your app on. Yes, a lot of projects might go too far down the architecture rabbit hole, but just as many bend the other way not using proven tools trying to &quot;keep it simple&quot;. For every project that is stuck using 2-ton framework, there is another that wrote a custom sub-set of said framework with 5x as many bugs, and no one but themselves to support it. Usually there is no correct choice, only compromises. The sum of these compromises is a complex software project.
TYPE_FASTERover 7 years ago
After having worked with a few really really good developers, who had both amazing productivity and almost zero defects, simplicity is now my goal.
评论 #16261404 未加载
krasickiover 7 years ago
Software <i>IS</i> &quot;the business&quot;. Software has always been complex. To make things easy in the application experience the complexity is pushed down. More to the point it is not so much that software is any more complex but the volume of software knowledge and awareness is overwhelming even to those coding the stuff. Platitudes about simplicity are a dime a dozen. Rather than despair take comfort in knowing you are not alone in feeling swept by a tide of perpetual software churn.
Annatarover 7 years ago
“C gave us similar advantages over writing in assembler.”<p>This is a profound misunderstanding of both C and assembler: C gave us portability, not reusability; writing shared object libraries with reusable code in assembler has been the bread and butter of programmers for decades, and it takes no longer to do in assembler than it does in C. A stereotypical example of this is the Commodore Amiga, where most of the shared libraries are written in assembler.
emodendroketover 7 years ago
&gt; So if we have to develop the interfaces, workflow, and logic that make up our applications, then it sounds like we are stuck, right? To a certain extent, yes, but we have a few options.<p>&gt; To most developers, software equals code, but that isn’t reality. There are many ways to build software, and one of those ways is through using visual tools. Before the web, visual development and RAD tools had a much bigger place in the market. Tools like PowerBuilder, Visual Foxpro, Delphi, VB, and Access all had visual design capabilities that allowed developers to create interfaces without typing out any code.<p>[...]<p>&gt; And many companies are jumping all over these platforms. Vendors like Salesforce (App Cloud), Outsystems, Mendix, or Kony are promising the ability to create applications many times faster than “traditional” application development. While many of their claims are probably hyperbole, there likely is a bit of truth to them as well. For all of the downsides of depending on platforms like these, they probably do result in certain types of applications being built faster than traditional enterprise projects using .NET or Java.<p>Huh? I challenge this guy to start up a WinForms project in Visual Studio and tell me what&#x27;s substantially different from the Access forms designer. But this comes with its own limitations (it gets messy fast if you want to do something &quot;non-native,&quot; collaboration is a challenge, it encourages sloppy mistakes like misaligned controls, poorly named controls, and form logic interleaved with business logic) and, more importantly, doesn&#x27;t actually do the hard part. Creating buttons and boxes can be tedious if you don&#x27;t have some kind of tool to do some of the work for you, but even in an environment where it&#x27;s totally done by hand it&#x27;s not where the bulk of effort in a project goes.
bfungover 7 years ago
A recurring common theme every so often.<p>The blog post isn&#x27;t really focused though - the solution proposed is to &quot;keep it simple&quot;.<p>Click on the &quot;Simple Thread&quot; menu option - ah, all makes sense now.<p>A &quot;Software is too complex&quot; blog post by a Custom Software Development shop.
tremenduloover 7 years ago
I wonder whether the most stable yet complex and versatile form of software will turn out to be AGI. Could a mind be the only complex &#x27;tool&#x27; that doesn&#x27;t require a small army of other minds to maintain it?
评论 #16260630 未加载
luordover 7 years ago
I know it&#x27;s a different issue but this reminded me of the developers who mention five design patterns for every requirement listed. It&#x27;s often pointless and, more often than not, it&#x27;s easier to just describe what is it they mean when they mention them.<p>I&#x27;ve picked a stack, it&#x27;s simple, straightforward enough, easy to pick up and understand and fits most applications, and every one I&#x27;ve tried to work on my own. I still try to experiment with new tools, libraries, etc, but often they end up as just that: experiments.
Silhouetteover 7 years ago
<i>Languages such as Python, Ruby, or JavaScript can take as little as one third as much code as C in order to implement similar functionality. C gave us similar advantages over writing in assembler. Looking forward to the future, it is unlikely that language design will give us the same kinds of improvements we have seen over the last few decades.</i><p>That seems a bold assertion. I can think of many, many ways that today&#x27;s mainstream languages could become incrementally more expressive, safer, or otherwise better. Quite a few of those ways have been implemented, just in less mainstream languages. The language trap is that to become successful you need not just the language but the surrounding ecosystem. It&#x27;s not that there aren&#x27;t still very significant gains available over the current popular choices.<p><i>Our obsession with flexibility, composability, and cleverness is causing us a lot of pain and pushing companies away from the platforms and tools that we love.</i><p>I don&#x27;t think real flexibility and composability are the problem. In fact, throw in longevity and you&#x27;ve got a decent foundation there for building good software.<p>I think the problem is that a lot of what&#x27;s going on in certain parts of the software industry today, particularly almost anything connected with web or mobile apps, is only offering an illusion of those benefits. A big, monolithic framework isn&#x27;t really more composable than a carefully selected set of libraries, it&#x27;s <i>less</i> composable. A tool that requires hundreds of lines of configuration to build a relatively simple application isn&#x27;t really more flexible than a few lines of shell script, it&#x27;s <i>less</i> flexible. A million tiny dependencies because you couldn&#x27;t be bothered to write a few five-line functions yourself aren&#x27;t really giving you more longevity, they&#x27;re <i>less</i> likely to make things reliable in the future.<p>I would argue that cleverness, in this context, is mostly about having good judgement. Are the costs of starting from a big, monolithic framework or relying on an extra tool going to outweigh or be outweighed by the costs of any lock-in and long-term dependency? Are the benefits of composing very many small components going to outweigh or be outweighed by the costs of keeping track of all the relationships?
skadamatover 7 years ago
Reminds me a lot of the article from the Atlantic (&quot;The Coming Software Apocalypse&quot;): <a href="https:&#x2F;&#x2F;www.theatlantic.com&#x2F;technology&#x2F;archive&#x2F;2017&#x2F;09&#x2F;saving-the-world-from-code&#x2F;540393&#x2F;" rel="nofollow">https:&#x2F;&#x2F;www.theatlantic.com&#x2F;technology&#x2F;archive&#x2F;2017&#x2F;09&#x2F;savin...</a>
raspasovover 7 years ago
I agree. If not “killing” at least “severely” slowing us down. This Rich Hickey talk deserves a link here and it’s right on point: <a href="https:&#x2F;&#x2F;www.infoq.com&#x2F;presentations&#x2F;Simple-Made-Easy" rel="nofollow">https:&#x2F;&#x2F;www.infoq.com&#x2F;presentations&#x2F;Simple-Made-Easy</a>
Nomentatusover 7 years ago
Simplicity is measurable along one dimension, by how easy software is to maintain, I believe. This can be measured started early on a project if one cares to spend a little money to test for this from time to time (hiring or assigning someone outside the project), so maybe we should be doing more of this.
swayvilover 7 years ago
Srsly. I&#x27;ve started just copying all my shit into the relevant package instead of all the subclassing. Because you know I&#x27;m gonna want to change that shit in the future. And whether I change the class or the subclass shit is gonna break. And then I gotta fix that shit. So I&#x27;m a caveman now.
评论 #16260671 未加载
meukover 7 years ago
Related: <a href="https:&#x2F;&#x2F;www.joelonsoftware.com&#x2F;2002&#x2F;11&#x2F;11&#x2F;the-law-of-leaky-abstractions&#x2F;" rel="nofollow">https:&#x2F;&#x2F;www.joelonsoftware.com&#x2F;2002&#x2F;11&#x2F;11&#x2F;the-law-of-leaky-a...</a>
dawhizkidover 7 years ago
How often is it the case that incidental complexity is actually accidental vs a conscious&#x2F;subconscious act to increase one&#x27;s own job security?
评论 #16261413 未加载
gfioravover 7 years ago
Way too late to the party but the issue here is that you&#x27;re valuing developer convenience over product maintenance.<p>Maintainability &gt;&gt;&gt; Convenience
zpatelover 7 years ago
Agile dev has also contributed to complex software.
评论 #16262498 未加载
shamasover 7 years ago
There are more technologies between C and a platform where you drag drop things... Who the hell develops with a drag drop interface?
halfnibbleover 7 years ago
I agree with 99.87% of what the author wrote. But unless all of your developers are using the exact same OS and libraries locally that are installed on your production server, then you really ought to be using &quot;containers.&quot; Because who wants to debug library differences on production?<p>By the way, if anyone is interested in trying out an incredibly productive web framework, I recommend checking out Django. Need an API? The Django Rest Framework.
meri_dianover 7 years ago
Software Complexity is <i>Employing</i> Us
wellpastover 7 years ago
These posts are a dime a dozen. Many developers get to that place where they realize the wide gap between what they suspect, or intuitively know, can be done easily&#x2F;quickly in their software system but for some... reason... just... _can&#x27;t_ be done quickly, easily. What they know should only take a day (it only took a day when I started building the thing!) now takes two, three, a week...<p>For the reflective types we start to see, correctly, that it&#x27;s all rooted in &quot;complexity&quot;. I have to _deal_, _contend_, etc. with all these _needless_ _things_ that I didn&#x27;t have to deal with originally. This &quot;algebra&quot; of symbols was once easy to do math in, but now I can barely add two and two.<p>Some laugh uneasily at this point and say, &quot;whelp, that&#x27;s software for you&quot; and go home and smile at themselves in the mirror. Others mull on the idea but don&#x27;t apply enough rigor of thought to get past the fuzzy thinking where many a soul that&#x27;s pondered this problem has found themselves stuck.<p>And so we get posts like this that are more lament and helpless than they are useful. You can toss a rock and hit these posts, they&#x27;re all over the place.<p>The only way out of the complexity hell is rigor in thought at every level--at the level of our jobs ultimately, but in this case at the level of analyzing what _is_ complexity. That is by giving it an objective description, and showing what is and isn&#x27;t complexity.<p>Many of these dime-a-dozen posts proceed to talk about complexity in relation to abstractions or lack thereof, etc. But they always miss the metrics of complexity.<p>Complexity is the lack of Simplicity, that&#x27;s it. And Simplicity is _objective_. I&#x27;m not trying to be exhaustive here but you should get the gist:<p>Clear interfaces Clear and minimal dependencies Precise semantics&#x2F;contracts Minimal coupling<p>In any case, these are objective measures. And interestingly have very little to do with the lines of code that implement them.<p>Give me a system and tell me what it does. Now I don&#x27;t think there is a proof (yet) that will say that a system is optimal with respect to these simplicity dimensions but I can tell you that if you give me another but differently organized&#x2F;architected system that does the same thing, one will be _objectively better_ on each of these dimensions than the other and it will be very easy to point and show you the relative winner.<p>So once a team realizes this, you can optimize the simplicity of your system by having your members give their design pitch and the objective winner will emerge. (Yes, getting your business axioms pinned down, priorities, etc, is a hard problem here, but the fact that I&#x27;ve seen very few people track this whole realization means we haven&#x27;t gotten _there_ yet. We&#x27;re still trying to reach Milestone 1.)<p>Only when Milestone 1 is met, have you gotten your own personal team&#x27;s optimally simplest solution. But you&#x27;re still as strong as your team&#x27;s weakest link (ie, your team&#x27;s weakest designer&#x2F;simplicity-optimizer.)<p>Now here&#x27;s the thing. To get _good_ at building systems that optimize for simplicity you have to get _good_ at it, and to do that you have to _practice_ it for a long f-ing time.<p>I&#x27;ve been in industry for a long time and have worked with very smart people, top brass from the big FANG blah blah blah, and what many of these guys get good at, unfortunately it is not simplicity optimization. Not because they&#x27;re not smart (in fact Alan Kay&#x27;s &quot;IQ is a lead weight&quot; is spot on in these cases), but because that&#x27;s not what they have been optimizing for in their careers. They simply have not been focused on simplicity optimization.<p>To be fair, you actually hurt yourself by trying to optimize for this skill set because it takes so long to master. So if you take time to master it, you are not spewing out code and getting raises with everyone scratching their heads a year later why is everything so complex.<p>But this question of complexity is all very simple, if not easy: Simplicity is objective. It takes a long time to master it as a skill set.<p>Why is every single post&#x2F;discussion about complexity trying to think about or solve it some other way? I suspect it&#x27;s because no one wants to realize how short they are on the skill set--which sadly is _most_ of our industry from my emprical point of view-- &quot;It must be somethign _out there_ that is the problem, because _I_ am smart, _I_ have been doing this for a while, no, it can&#x27;t be because I am _short_ a skill...<p>What I can say for sure though is that the skill set can be acquired with practice. But where is the training simulation, where does one go to practice? In industry, you really have to be quite vigilant and aggressive and calculated about it...
评论 #16302654 未加载
评论 #16265495 未加载
dondenoncourtover 7 years ago
Here! Here! Personally, I&#x27;m getting tired of refactoring NoSQL back the standard SQL and merging multiple &quot;Microservices&quot; apps into one manageable app. And figuring out the JS Single-page framework Dijour when standard Ajax-based pages would have cost far less to create and maintain yet provide the same functionality.
评论 #16260555 未加载
评论 #16260516 未加载
评论 #16261449 未加载
Chiba-Cityover 7 years ago
Great piece. 1) The title might be &quot;Incidental Complexity is Killing Software.&quot; 2) Typing speed of scripting languages is truly a HIGHLY deceptive metric. Server resources are not free, and unit testing is wasted on type checking which compilers do cheaper. 3) For different sad reasons, software organizations CANNOT manage to do cradle-to-grave resource planning and schedule assessments all the way through sales, training, help-desk and MRO. 4) Why software ENGINEERS fetishize tool and equipment purchases like consumers I&#x27;ll never understand. The application wins are cool. The tools are tools. 5) The developer stovepipe desire to &quot;have their part work&quot; is another contributing pathology. Software delivery is a team marathon styled sport.