17 ms·
Blue. No, Yellow
- mmatants 10y agoIt feels like the early language wins were due to the languages themselves introducing new concepts, not just syntax changes. Allowing higher-level reasoning. Then, past a certain point, most of the new concepts started coming in via frameworks and libraries (although of course things like functional programming and interesting typing approaches are still language-driven tools). Thus, these days, I would look at libraries and frameworks as sources of new productivity unlocks. E.g. in the Web world, jQuery saved millions of work-hours and qualitatively unlocked some new things. Then Angular (and eventually React) started realizing huge savings from declarative UI definitions. My preference for one next innovation in this area is a higher-level framework for user input modeling (a huge source of bugs these days).
- thyrsus 10y agoI'd bet that, because the erlang family (erlang, elixir, erlang flavored lisp, ....) introduces important concepts when multiprocessing is involved, that they lead to a non-linear increases in productivity when multiprocessing is relevant to the problem. Further, multiprocessing may be more widely applicable than widely recognized, because the benefit has previously been lost to the former complexity and error-prone nature of multiprocessing.
- skybrian 10y agoThe language still matters, but indirectly, because it constrains which frameworks can easily be built. It's doubtful that jQuery and React would have been invented using Java. Even JavaScript is nicer with a language extension (JSX).
- kuschku 10y agoThe thing is, Java has (with some tricks) a fully pluggable compiler. And even without tricks, compile time processing is possible. But Java is "uncool". That’s the big issue.
- skybrian 10y agoThe issue is that if you want to do template-like things using language constructs (internal DSL), the syntax is quite limiting. There are tricks using annotations and strings, and Java 8's lambda expressions do help. But it's still awkward to define a React-like mini-language within Java.
- kuschku 10y agoWell, anything that is a valid syntax can then be modified by the annotation processor. Add the fact that you can do blocks, and label blocks, and you can do practically s-expressions.
- wtbob 10y ago> It feels like the early language wins were due to the languages themselves introducing new concepts, not just syntax changes. Allowing higher-level reasoning. I was looking for somewhere in these threads to post my comments, and I think this is the right place: yes, you're exactly right, it really is about higher-level reasoning. Assembly enabled one to think about instructions and operations instead of hex codes. Structured languages enabled one to think about programs, rather than sequences of mnemonics. Functional programming enabled one to think about functional transformations of data; object orientation enabled one to think about collections of functionality grouped with data; both structured the structure, in different ways. With each improvement, we were able to reason at a higher level than before. But we're not at an optimal level yet: we still do not have mainstream ways to manipulate the structure of our structure (… of our structure of our structure, ad infinitum). We still don't have a mainstream way of dealing with our programs as data. It may not be mainstream, but we do have a way: it's older than every other programming language other than Fortran: it's symbolic expressions, which enable one to reason about and manipulate one's code as data (and data as code). The article we're both replying to is a prime example of the Blub Paradox: Uncle Bob can see how Java is better than C++, C, assembler or hex codes, but can't see how Python — and, yes, Lisp — are better than Java.
- lalaithion 10y agoI dunno, I'd still take a 5% improvement. Let's say I work exactly 40 hours and week and 50 weeks a year. Then a 5% increase in efficiency means that I can do 2 extra weeks of work per year. That's not a lot, but on a team of 26 programmers that's essentially the equivalent of hiring a new employee (without the downsides of a bigger team and the cost to bring someone up to speed).
- liw 10y agoAlternatively, you could give yourself and your employees a decent amount of vacation each year. Two weeks per year. Sheesh.
- skybrian 10y agoNice blog post. Of course it doesn't take into consideration the time to understand and fix bugs, to add new features, to run tests, to review changes, to make large-scale changes, and to on-board new programmers. The arguments in [1] still apply. [1] http://martinfowler.com/bliki/CannotMeasureProductivity.html http://martinfowler.com/bliki/CannotMeasureProductivity.html
- spraak 10y agoThe dialog format of that is very pleasing to read
- lukevers 10y agoDefinitely. It's probably the best formatted dialog blog post I've seen in a long time. I know it's so simple, just using blockquotes, but that's what makes it so great.
- jccalhoun 10y agoI'm really surprised to see people say they like this style. I hated it. I was reading it and was saying to myself "why is this fake questioner so fixated on a number?" It is the straw man interviewer. I would much rather he get to his point than thank this fake dialog.
- guard-of-terra 10y agoThis reminds me that at the beginning of XX century, physicists talked how they have mostly completed the grand building of Physics, figured all the important things out but maybe just overlooked a few details.
- YuriNiyazov 10y agoHe keeps on pressing his imaginary partner in this conversation to just concentrate on the number of equivalent programmers rather than any other measure like performance or probability of bugs making it into production and the cost of fixing them, and then when they decide there's no more gains to be made from programming speed, all of a sudden we are at the pinnacle. No, we are not at the pinnacle, because programmer speed (as he very well knows, because he keeps on putting those objections aside) is not the only thing that matters.
- xentronium 10y agoThis post is a great oversimplification. Normally something like that could be ignored to get the bigger point across, but it kinda is the point, so I call BS. Have 10000 experienced ruby programmers and 10000 experienced java programmers solve different tasks. I'm pretty sure that rubyists are going to solve their problems using 50% less time with at least 30% less LOC just by the virtue of having a more expressive language. Now I'm not trying to argue that ruby is strictly better than java, I know both languages' deficiencies. However, the metric author uses is development time, and by that metric more expressive languages will always win, hands down.
- kordless 10y agoThere's no BS to call here. The point of the post is to show diminishing returns are occurring with ever evolving languages. The argument one should use X language because you can develop in it faster is increasingly not useful to discuss. You are stuck in the weeds arguing X will always win, when the point is there's nothing to win.
- xentronium 10y agoI disagree. Many programming languages are here just because they're good enough, not because they are perfect. For example, C is a good enough systems language. However, when compared to Rust, it's worse at most important criteria, including being more error-prone and less expressive (it's absurdly simple, though). Now you say there's nothing to win, but to me the advantages are obvious: I can avoid several classes of critical vulnerabilities and at the same time not substantially lose any performance. How would that be possible without search for the holy language grail?
- adwn 10y ago> it's absurdly simple, though C is only "absurdly simple" as long as you don't touch undefined behavior, which is nearly impossible in non-trivial programs.
- pka 10y ago
- robbrown451 10y agoI enjoyed reading it, I particularly liked the interview style. I'm surprised he didn't mention, in addition to compiles times changing, that editors and environments improve dramatically. (I guess he alludes to punch cards, but still). And they can affect whether one language or another is an improvement (for instance, Java with is stricter types really benefits from an editor that can do autocomplete, in my opinion) I do think that most technologies follow this sort of progression. I mean, if I go buy a new computer now, it is going to make me incrementally more productive. I'm 52, so there was a day when I was buying a computer to replace a dedicated word processor (i.e. a typewriter with a tiny amount of memory and and small LCD display), and it was a dramatic improvement. As was the word processor compared to a plain old typewriter. I don't expect that kind of drama when buying something to type on now. Things are slightly more dramatic with touch screen devices, but that is starting to slow down. Other things, like a dishwasher, even less so. I hope something interesting will speed things up again, but I expect it will be like what happened with phones and tablets coming in and replacing many functions of old-school computers for so many people. That is, a new way of automating computer behavior that doesn't mostly come down to editing text files. As an example, a technical person could train a humanoid robot arm to wash dishes by talking to it while the robot mirrors the motions of the trainer's arms. Is that programming? I'm not sure, but when we start seeing more of that sort of thing, and it increases in sophistication, I would expect more of those big jumps like moving from binary to assembly.
- bloaf 10y agoThis is one thing that bugs me. The editors and environments haven't been improving dramatically. Emacs is 40+ years old at this point, and still as hard to learn as ever. The 1970s Unix-like OS is still at the core of most dev-environments, despite people having better ideas since then (e.g. Inferno.) Sure, there have been incremental improvements to the editors and OSs since their inception, but there were no major revolutions. It has always seemed to me that the story of improved programming environments is driven more by improved hardware than improved software, and that companies like Microsoft/JetBrains are the only ones who've even bothered to wonder if its possible to create a better environment for programming than "arcane text editor."
- FunnyLookinHat 10y agoIt's not quite as simple as preferring one color over another - some languages, by (their own) definition, lend themselves to certain tasks more willingly than others. Rather than expecting a specific gain from a language (e.g. 20% faster development), you have to think in terms of avoiding the language that might be 20% slower for the specific problem being solved. For example, a seasoned engineer would likely not choose to use PHP for a stateful, socket-based messaging system to connect a dozen or so users. Why? Because PHP is not designed to do that task well. It could do it - you could poll an HTTP end-point and use a cache for really fast persistence to wire it all up - but you'd likely start having to write code around the problems you'd encounter for all of the nuances to your specific implementation. Yet another example: The main reason Go looks attractive to a certain set of developers is that it solves a problem with describing and handling concurrency that they've had with a lot of other languages. They would be dumb to say that Go is carte-blanche better than PHP (or Ruby, or Java, or even C/C++), but that doesn't mean they won't see a potentially significant improvement in using it.
- aftbit 10y agoI think this misses a very key point - subject matter. Some languages are well-suited to do particular things and comparatively poorly suited to other tasks. For example, Erlang is great when you need to do lots of concurrent operations with guarantees about safety and uptime, but not really what I'd write a CSV parsing program or email client in. C is very easy to link against on almost every platform and language, so basic libraries are often written in C. Javascript (in the form of nodejs) is great for writing simple web servers because most of its standard library is asynchronous by default. Compare Python (with Tornado or similar) where lots of popular libraries cannot easily be used in an event loop. I could go on forever, and you might disagree with me about a particular details, but the general point stands. If you took an expert Erlang programmer and gave her a day to write a spreadsheet application, you'd get a worse result than the same day spent by a C# programmer.
- angersock 10y agoA better example would be to compare the Erlang programmer, the C programmer, and a good SQL DBA. CSV/spreadsheets is a poor example (least of all because I think you're wrong, but that's neither here nor there). DSLs can give you tremendous amplification when you play to their strengths.
- santoshalper 10y agoI agree. The (fictional?) person asking the questions was asking for universal productivity improvements, and I think we are long past that point. There are essentially no scenarios where programming in assembly is more productive than programming in C, but those kinds of open/shut comparisons don't work well for the long-tail environment that we live in now. People are building new languages to solve specific types of problems better.
- capitalsigma 10y agoYeah, the effect of libraries is huge and ignored by this analysis. There's a good reason we see so many web apps written in ruby/python/node and so few in C++.
- 10y ago
- mynegation 10y agoSmall nitpick, especially given that all numbers are "guesstimates", but if "X is 30% more efficient than Y" it is not "10 programmers can do a work of 13", it is ((13*0.7 = 9.1 ~= 9)) programmers.
- sokoloff 10y agoSince you've taken us to nitpick land, I'd argue that you've expressed "Y is 30% less efficient than X", and that 10 can indeed do the work of 13 if instead "X is 30% more efficient than Y". To me, the reference standard is assigned unity. In the first case, X is 1.00 and Y is 0.70. In the second case, Y is 1.00 and X is 1.30.
- kordless 10y agoAs soon as AI kicks in, we'll have another order of magnitude increase in the ease of programming. "Alexa, write me an API for this $5 wifi enabled light on my desk that I soldered together yesterday."
- andrewstuart2 10y ago"Alexa, this is crap. I told you two spaces, not four. And everything's in the global scope." It was then that Alexa began to plot our demise.
- fizx 10y agoI wish there was an IDE that would present code in your preferred format (e.g. 4 space tabs, curly braces on independent lines, etc), while still keeping the code on disk and in scm the same as the existing style (so diffs stay small, and your teammates are happy). It shouldn't be too hard to learn a bijective mapping between your style and everyone else's style. If we're still using IDEs in twenty years, I'd expect this to have been done by then.
- alexandercrohde 10y agoThis 100 times over. I cannot estimate the amount of time otherwise brilliant engineers have wasted over aesthetics that really aren't a meaningful part of the code and should be rendered distinctly on a per-developer basis.
- sdenton4 10y agoWhen writing Python these dates I almost always use iPython notebooks for prototyping, before throwing things into modules. When I switched off to Java and go a while back, the increased overtime for compiling was pretty noticeable. But even more noticeable was the loads of the ability to play around with each little block of code, with data in-memory, until I was completely happy with it. It's a bit like interactive debugging, but with a great deal more freedom. As a result, I get a huge reduction in mental load when writing Python in a notebook; my attention is extremely focused on the little bit of code in working up in that moment. This is a real win for productivity, beyond what you get from the zero compile time. (Also, Java compile times are not zero. Even waiting a minute for a large compile is enough to create a break in concentration.)
- PaulHoule 10y agoThat's why Java IDE's usually have a visual debugger that actually works.
- reitanqild 10y agoI am sometimes (i.e. I think this happens a lot) bit puzzled by looking at very intelligent people who doesn't know about the debugger or knows about it and doesn't use it anyway. If you program Java then please feel free to use the excellent tooling that is available.
- jjoonathan 10y agoIt's just habit. Code in a language with bad tooling and you too would develop habits to work around the lack of tools. It just takes time (and sometimes a bit of convincing) to adjust. And to adjust back, of course. "Type A" coders are especially vulnerable to this kind of habituation on account of often being interested in esoteric languages, systems programming, or other "extreme" environments with tooling restrictions.
- TeMPOraL 10y ago
- tardo99 10y agoPart of why Java is slow is it requires so much typing. I think Ruby winds up taking maybe 50% or less the time of Java just because of this.
- douche 10y agoType three or four letters and hit enter, and have the IDE autocomplete the rest of your SpringBeanFactoryAdapterFactoryFactory type declaration? I think you're putting up a strawman.
- collinvandyck76 10y agoAside from the fact that with IDEs this is mostly invalid, it misses the fact that writing the code initially is typically a very small part of program's life. Operation, maintenance, and the complexity thereof ends up dwarfing the initial sunk cost.
- spion 10y agoAnother post contributing towards the already high likelihood that Uncle Bob is completely oblivious of typed pure functional languages like Haskell (or Idris, etc)
- spion 10y agoForgot to add: Uncle Bob, please try Haskell. But not just for a tiny program, because it does take some time to get used to it.
- dunkelheit 10y agoI was waiting for something like "and then people invented TDD and that gave another 10x improvement" but it didn't come. A surprisingly balanced post for Uncle Bob.
- tschellenbach 10y agoMy estimate is that Python & Ruby are about 4 to 5 times more productive than Java for the case of web/API development. The benefit grows with the size of the codebase as Python & Ruby are also easier to read and maintain. The point the author raises about types is only partially true. Both in Java and Python you should be unit testing your code. If you have good test coverage and CI than it really doesn't matter that Ruby and Python don't check your types. So blue is my color :)
- tschellenbach 10y agoIn Java's defense.. For certain use cases like data processing and other CPU intensive workloads it runs circles around Python and Ruby. So I guess it depends.
- twblalock 10y agoJava is faster than Python and Ruby for almost every use case.
- twblalock 10y ago> If you have good test coverage and CI than it really doesn't matter that Ruby and Python don't check your types. People say this a lot, but it's not true unless you have 100% coverage, 100% control over the data that gets input into your program, and you can think of every possible test case that covers every possible situation that can occur. Many of the tests you have to write for programs in dynamic languages are simply not necessary for strongly typed languages. Furthermore, compilers for static languages catch (or warn about) a lot of problems that would otherwise have to be reproduced by the kinds of test cases nobody is likely to think of -- this results in bugs making it to production when you use dynamic languages.
- deleted 10y ago[deleted]
- winstonewert 10y ago> People say this a lot, but it's not true unless you have 100% coverage, 100% control over the data that gets input into your program, and you can think of every possible test case that covers every possible situation that can occur. This is different from static typing, how? > Many of the tests you have to write for programs in dynamic languages are simply not necessary for strongly typed languages. Actually, dynamic typing users write very few additional tests. Users of static typing seem to imagine a lot of additional tests being needed, but dynamic typing users don't write them. They are usually for scenarios that are important enough to test. > Furthermore, compilers for static languages catch (or warn about) a lot of problems that would otherwise have to be reproduced by the kinds of test cases nobody is likely to think of -- this results in bugs making it to production when you use dynamic languages. Not my experience. Almost all bugs caught by static compilers are ones that a single execution of the relevant code would also catch.
- GnarfGnarf 10y agoHere's a benchmark: in 1970, I had a full-time job maintaining a 4,000-line assembler program on punched cards. Today I manage a 400,000-line system in C++. That's 100:1.
- santoshalper 10y agoThat's an interesting point also - scale. I don't think programming a simple "hello world" in C or C++ would be 100x faster than in assembly (assuming you were equally familiar with both languages), but I think it would be nearly impossible, or at least incredibly expensive to maintain 400 kloc of assembly. I honestly shudder at the thought.
- Someone 10y agoYou would use a macro assembler, and if you have good programmers, they would effectively develop a DSL for writing your program in it. That would postpone the point at which that assembly program reaches 400kloc. In the end, it would probably grow as fast as a C program of the same functionality. Of course, they also would have to develop their own tooling around that DSL. That, I think is the problem lies with assembly. Higher level languages imply that more stuff gets shared between projects (even across companies; everybody will use the same C language and standard library), and that means time spent to develop tooling around and libraries on top of the shared stuff is useful for more people. Hence, tooling and libraries will generally be of higher quality. that home-grown GUI library built on top of a home-grown set of assembler macros using a home-grown ABI may be better than using, say, QT on top of X11, but it isn't that likely. On the other hand, the smaller the system, the more important memory usage, and if the system is small enough, that can and will swing the advantage to the home-grown system. That happens less and less, though.
- danieltillett 10y agoWow that is some long career you have had. What have you done in between?
- chadcmulligan 10y ago
- fiatjaf 10y agoSo a Python programmer today can only make things 25 times faster than someone writing binary code in 1950? Really?
- emeraldd 10y agoThat's only true for a small subset of applications. Beyond the code that the programmer is actually writing themselves and direct language features, Python (and most modern languages with good library support) makes a standard library (and many third party libraries). The library of external code that developers don't have to think about wasn't really covered in the article but is one of the things which multiply that 25 significantly higher.
- jpolitz 10y agoAnother important metric: a handful of C programmers can write arbitrarily more buffer overflows than thousands of Java or Ruby programmers.
- mbfg 10y agoDebuggers in managed languages are probably the biggest workload reducers as a percentage since binary -> assembly.
- itsthecourier 10y agoNo data, no serious hypothesis
- itsthecourier 10y agoWithout data this is just a words game
- Bromskloss 10y agoWhat is the message here?
- alexandercrohde 10y agoReading between the lines, the author actually feels this: "Stop making a new language every month. The ones we have are good enough, and it fractures inter-developer cooperation when we don't know the same languages, rebuild all the same libraries over and over for different languages." Which is one valid viewpoint. But he couches it in the socratic method against a strawman (presumably himself) which ultimately leaves the reader feeling dirty.
- Retra 10y agoThe problem of handling an environment with richly diverse hardware and languages is itself an interesting problem, and probably much more analogous and appropriate to the problems of meaning human society. So if someone were saying to me "stop developing new languages and environments; it makes things hard", it'd be like saying "stop developing new culture or human relationships, because life is easier when we're all bland and homogenous." I find it a little bit offensive and at least a failure to recognize the important problems (due to obsession over the easy ones.)
- alexandercrohde 10y agoWell, that's one analogy. How about this analogy, what would you say to me if I said "Hey I invented a new spoken language, it's more efficient than English?" And what if I did this in a climate where dozens of people independently were already doing this too? So, to simplify, I think the reason a lot of developers roll their eyes at another new language is because the problems the languages are solving are less important than the fracturing they make in the engineering community. If you think a language is missing something, why not contribute to the language with an RFC. C++, Java, and PHP have all been advancing significantly over the years. Or why don't you get together with 100 other language-makers and come up with a unified solution?
- Confiks 10y ago> How enormous? Give me a number. > I need a number > The number? The article places annoying attention to quantifying "workload estimates", whatever that even means. Because the written interview is so verbose, we know that the author just brushes away the interviewee's remark that 'other important factors effect that workload', and then proceeds to cryptically dance around those factors with very opinionated questions.
- AstroJetson 10y agoIn my opinion it's not the language, it's the libraries. Lets take Java vs Fortran and look at the language basics. They pretty much have the same basics: assignments, control structures, function calls. What makes Java rock isn't the language it's all the library code that comes with it. People are always saying "Look at me I can write a web server in six lines of code." No, you can call a web server library that someone wrote for you in six lines of code. Aftbit (some place in this thread) has a good point, some languages are better with some subject matters. I'd like to also posit that some languages have better libraries written for a subject matter which makes it appear they are better for that subject. We've seen lots of people port libraries to a different language to help them. While I do agree that some languages give you a boost up because the compiler is doing some heavy lifting in the background, it's the huge collections of libraries that we can call that lets us stand on the shoulders of giants.
- derefr 10y agoTrue; it's a crying shame, though. It's 2016: why are libraries still limited to the language-runtime they were written for? Why must there be more than one library ecosystem? Why can't I import Javascript libraries from Ruby, Python libraries from Java, Erlang libraries from Haskell, Go libraries from Rust? Why can't they all just be "libraries", fullstop? (Right now, we have to explicitly embed one runtime into another, creating programmer's turducken, if we want anything close. This, though, is an artifact of the way we think about efficiency as requiring address-space cohabitation. And while it's easy to set up a runtime-heterogenous melange using IPC, the default for that is inefficient serialized streams on sockets. Where's my zeromq-like zero-copy message-passing IPC as a batteries-included part of every runtime? Where's my binary wire-type-encoding standard aimed at producing "toll-free-bridged" native types in multiple runtimes? Where's my "managed" OS with malloc-time kernel-side type-tagged memory-buffers[1] that all runtimes for that OS support loading? Where are my multi-runtime application servers with jail/lxc-like application domains to isolate mutually-untrustworthy clients?) [1] Speaking of, whatever happened to capability-based operating systems? Hardware support for capabilities would basically let us get rid of the "process" abstraction altogether, and just have a big OS-wide heap with various units of concurrent execution holding capabilities on various memory-objects.
- koenigdavidmj 10y agoI think it was the GoF Design Patterns book that also spoke into this. They said that every level of language would have its own patterns, and that lower level languages' patterns might be language features with first class support in higher languages. Examples: * In assembly language, the design pattern might be the function (a published interface for a common block of code, and a well-defined protocol for getting data into and out of it). * In C, it might be the basics of C++'s object-oriented programming features: single inheritance at first (have your parent class be the first member of the structure, then cast to whatever level you need), followed by vtables. * In C++, it might be 'interpreter' or 'visitor'. Lisp macros make building DSLs a lot easier (see something like LOOP for a basic example), and CLOS' multiple dispatch nearly obviates the visitor pattern. I'll agree with the article, though, that most languages are settling on the same norms, mostly borrowed from the functional world. Swift, Rust, C++, and Java are all gaining most of these: making it easy to avoid nulls safely, pattern matching, parameterized types, method chaining over explicit loops, and a non-dogmatic preference for immutability over in-place modification.
- hythloday 10y agoI would suggest that pattern matching over ADTs is what has subsumed the visitor pattern.
- scotty79 10y agoHow much workload language like awk saves when compared to java? On text processing tasks, nearly all of it.
- chrismonsanto 10y ago1. This post would have been more interesting if the person he was having this dialog with was a PL researcher/designer. 2. Uncle Bob is trying to speak with authority, but this subject matter is outside his area of expertise. At least in his previous post, he was nice enough to state this up front: > Learning swift has been an interesting experience. The language is very opinionated about type safety. Indeed, I don't remember using a language that was quite so assiduous about types. 3. I see that Rust, Haskell, and OCaml were conveniently left out. He hand-waves away other modern languages with "negligible," which is hilarious because he is so obnoxiously wordy in the rest of this post. Not very convincing.
- nickpeterson 10y agoI like a lot of Uncle Bob's posts, but his opinion on functional languages is bizarre. He seems to like them (especially clojure), and talks about how they tend to force programmers to stick closer to patterns pretty universally regarded as better (immutability for instance), but then sort of punts when asked to compare them to OO languages. I think, to some degree, his belief in TDD, Solid Principles, and short cycles means that functional languages have less to offer developers than many think because he's comparing Java executed with excellent practices to stock functional languages. I think that C#, Java, and OO-design just leave too much room for developers to go astray. Something like F# results in better code not because of the features of the language, but because of what it doesn't allow.
- wpietri 10y agoInteresting! I agree entirely that Java and OO leave a lot of room for developer to go astray. And I've enjoyed my limited coding in functional languages. But is something like F# really better in practice? I ask because every functional-language code base I've been able to look at myself has two advantages: 1) it's not very large, and 2) it was made by very smart, experienced developers with a passion for functional languages. When I look at similarly sized OO code bases produced by people with similar levels of passion and expertise, the code base is also very good. The terrible Java code I've seen, on the other hand, mostly comes from less experienced people whose priorities are things like "keep boss happy", "put in all required hours", and "comply with project plan". Which is, sadly, the average case in the industry. So I'm wondering: What happens if some functional language becomes mainstream? Will junior programmers at EnormoBank's latest death march produce better software?
- chadcmulligan 10y agoActually I would argue the converse, that many "modern" improvements have taken a step backwards. My first job was using SQL*Forms (an oracle product) on a Sun, it was for making CRUD apps on a tty (a terminal). We had a metric - small form (just some data fields) 1/2 day, medium form 1-2 days (perhaps a master detail), large form (master detail detail perhaps with some popups) 2-5 days. Next was VB and Delphi - drag and drop stuff on the screen, you could write whole systems in a few weeks. Had wonderful screen painters and so on. Then the browser - a disaster in productivity, writing things in a tag language - no visual ide support (still). Now the maximum complication of programming with MVC and languages with so many features no one person can know them all (C++ I'm looking at you, C# and Java are up there though). I look forward to the next innovation
- derefr 10y agoProductivity has to be measured with the implemented use-case held stable. Visual FoxPro was probably the pinnacle of "easy to make CRUD apps", but the result is, at most, an program that runs on a few computers on a corporate Intranet, that each must use a specific version of Windows with a pre-installed runtime. A modern LAMP app, despite being composed of layers upon layers of kludges, can be immediately interacted with from any computer in the world, with no sysadmin experience, by entering a URL, and—with no particular effort into architecture or scaling—allows for thousands of simultaneous users to submit changes to the same data in a perfectly consistent fashion with no "whole document is locked for modification"-type problems. The LAMP app also has a number of modular boundaries that the FoxPro app doesn't: the backend server treats its database as a black box, so it could actually be a replicated cluster, or a different DBMS the next week; the frontend JS treats the backend as an opaque HTTP API, so either of the two could be rewritten or outsourced, and the API could be repurposed by new clients with no additional effort put in on the backend team's behalf; the frontend is built up from layers of specifications (e.g. CSS features) that are each optional, such that you can visit the site from a copy of IE7 on a Windows XP machine in a dusty Korean net-cafe and it'll still let you use the app, just in a less pretty fashion; and so forth. (And this is ignoring the 10x advantage in accessibility for blind users markup gives over old pixel-blitting GUIs. Modern GUIs are "markup-based" in a similar sense—Cocoa NIBs, Microsoft XAML, etc.—because it's far easier to accessibility-enable a frontend when it exists in the form of an UA-inspectable DOM, rather than an opaque framebuffer.) If all you need is the paired-Windows-98-machines-in-your-office use-case, sure, use Visual FoxPro (or whatever the modern equivalent is. FileMaker Pro?) You can go even simpler, if you like, and just use green-screen terminals pointed at an ncurses app running on your office machine. But if you need the Internet use-case—where everyone with any tech experience level can use your app from anywhere on any old device, all at the same time—nothing less than the stack of kludges we've got is actually up to solving that problem.
- dahart 10y agoI'm many times more productive in python than I am in C++ for lots of reasons, but I feel like the clerical parts and compile times only add up to a small minority of the reason why. The respective standard libraries included with the language, the ease of finding existing code you can build on, the ecosystems surrounding the languages are all things that lead to meaningful differences in productivity. Interpreted vs compiled is indeed a major difference, but I feel like focusing on the compile time difference doesn't account for it or adequately summarize, there are significant mentality and workflow changes. Bob might be right that we're approaching negligible differences in programming languages, but I hope not, and I'm not at all convinced. It seems like the introduction of new useful concepts into mainstream languages is accelerating right now. And I expect to see huge advancements in programming soon that leverage today's huge advancements in AI & natural language processing. I think it's within our reach to be able to describe to a computer what our end goals are and have it figure out how to put together the pipeline to get there.
- agumonkey 10y agoNaN, try to prove anything in assembly.
- agumonkey 10y agoNaN, try to prove anything in assembly.
- jfoutz 10y agoI disagree. If all you have is switches on the front panel, symbolic assembler isn't really much help. You just memorize that 0101 0000 0001 = register move from r0 to r1. It may take a week or a year, but eventually you sling that binary like it's nothing. I suspect the same is true of punch cards. I built a computer with TTLs back in the early 90's whopping 256 bits of ram. but it was programmed with switches. it really doesn't take that long to memorize the states. To be fair, i never had to toggle switches for work. there might be other factors i'm neglecting. The problem is like Carmack said, errors are depressingly statistical. you'll inevitably fat finger one of those switches, and everything sucks. Now, if i have a terminal, and can type the program into a file, things are a little different. but mostly, i just don't want to wear out the 0 and 1 keys. with a 4 bit encoding, i don't think there's really that much win with mov vs 0f. with a 5 bit encoding i'd have 32 keys to play with, and could probably type my intentions very quickly, with some practice. heck, you can sling bf pretty quick if you spend a week encoding something hard. The big thing is variable names are chosen for you - instead of 'money' you have 0x0128 or whatever. A symbolic assembler buys you variable names. That's a pretty big win when you get more than, say 100 variables and functions. Small programs, no biggie, you can keep it in your head. Things get bigger it gets tough to memorize everything. So clearly the benefit grows as programs get larger. But i'd be skeptical of even 30% on front panel switches. In an editor? If i can use emacs, i can probably set up syntax highlighting for instructions and arguments. Play some goofy game with variable names in comments an have emacs auto manage synching the comment and memory address. so i'm not sure it would be a huge win then. The big wins (for me) with C are total insulation from register <-> memory moves and stack discipline. this is a WAY bigger deal than binary vs symbolic. you can call any function you want without having to remember what registers this function will stomp. But i've never tried to toggle in C on switches. I can say, i get more done in C than assembler, but that's not claiming a whole lot. C++ vs java? Well, valgrind helped me a lot with c++. java means never running valgrind. That's not to say, i haven't had my share of NPE's in java. Java just tells you where it happened rather than crashing. Once you know what you want to say, You want to say that concisely, to minimize those statistical errors. IMHO I can be more concise with a higher level language, so those statistical errors don't bite as often. If i have 1 bug per 100 lines of code, i'd rather write in the more concise language. But i have upper limits to concision. APL is too hard.
- ysleepy 10y agoWhat a load of hot air. Reducing the differences between programming languages to their performance/productivity and then claiming the choice is just bikeshedding. Have fun with your ruby pacemaker, js air traffic control and life without static typing in 10mioLOC codebases. Why do I feel like i have to apologize for my negative view on this? He has a commercial interest in maintaining his guru status.
- SkyMarshal 10y agoWas my first thought too. He's judging "workload" by how much time it takes up front to write a program, which may be an important metric for "move fast, break things" social/mobile/local/web apps and the like. But he doesn't mention error rates, maintenance costs, LoC, or any other metric that mission/safety/life critical systems prioritize. The world view underlying this post is one of the reasons for shoddy software and all the breaches, data thefts, etc. that have successfully exploited systems flaws in recent years.
- agentultra 10y agoSoftware doesn't have to be safety critical in order to do harm. Security vulnerabilities, data loss... these all cause harm to the public interest. Whether by snooping, lost profits, online harassment -- these are problems we would be seeing less of if software developers took the view to construct software with fewer errors in the design stage. We simply do not because the practice of writing high-level specifications in the form of mathematical models or proofs is not common. I think the tools have become sophisticated enough and the maths approachable enough that it should be and can be used in the construction of non-safety-critical systems.
- lightcatcher 10y agoI also think his upfront time estimates were off. He estimated Ruby to be ~15% more productive than C. I don't write Ruby, but I do write a lot of C and Python. I'd estimate that it takes 5x less time for me to write a program in Python than C. Even if the 5x number is off, it's still a way larger reduction factor than 15%!
- 10y ago
- kdazzle 10y agoIf Uncle Bob is talking strictly about development cycles, running tests in Python - even in a heavy framework like Django - is pretty fast compared to like Java with the Play framework, which is excruciatingly slow, or even Swift.
- raverbashing 10y agoAnd this is a good example of why a lot of people can't stand this so-called "guru" The whole text reads more like one of those "reality shows" on TV with a load of fluff, lots of recaps and very few substance Then you scroll down and his brilliant conclusion is that Java and Ruby has the same coding efficiency when you do it his way. What a load of crap. I stand by my assertion: I wouldn't trust Uncle Bob with anything bigger than a Hello World. But if you have an over-budgeted corporate project you may look nice to your boss if you contract him
- radicalbyte 10y agoYou just have to look at some of the horrible software that he has worked on. He does, however, know his audience: mediocre managers of dysfunctional teams. For those groups - people who cannot themselves articulate the benefits of keeping code organized and testing the important stuff - his talks and books are invaluable.
- deleted 10y ago[deleted]
- mwcampbell 10y ago> You just have to look at some of the horrible software that he has worked on. Can you give an example?
- radicalbyte 10y agoFitNesse and Jenkins come to mind. I don't think that he has worked on any significant project for some time now (which is to be expected, he's a training / consultant / blogger nowadays).
- partycoder 10y agoAfter C things start becoming very subjective. C++'s standard library goes beyond C's. Java's standard library goes beyond C++'s. Then, having a standard library is necessary for compatibility. e.g: in C++ you can go and use something like Boost or POCO but then they might not play well with each other and you will need some glue code. Those "glue code" problems are extremely time consuming.
- EugeneOZ 10y agoLast point is bullshit - new languages sometimes contains new ideas and possibilities (like Rust), sometimes they are for specialized scopes (like R), sometimes they are just evolution of existing languages. Just unfollowed him in Twitter - it's not the first time I read such low-quality narcissistic "dialogues" in his blog, only because in past he had high quality book about clean code.
- lowbloodsugar 10y agoI've published video games in 100% assembly language, and others 98% C++ (with some tiny bits in ASM). The latter games were easily more than 10x complex, and were done in comparable time. Games now are done with tens of programmers, a lot of it written in DSLs or programmed by game designers using visual programming languages. ASM doesn't scale. It can be joyful though.
- source99 10y agoRegardless of my opinion this was a very entertaining read.
- rhythmvs 10y agoBut then again, by what number did opensource and package managers decrease the clerical workload? — Sure, if we’d not only consider machine architecture, language design and compile times, but add social factors to the equation, like ecosystems, business models, and network effects, well okay, then maybe a single, apprentice developer might do the work of a 100k MSc programmers, and at least as much as he `require`s modules. :-p
- YeGoblynQueenne 10y agoWeeell, we're kind of taking liberties here aren't we? How is Java to C++ what C is to assembler? How is C++ to C what C is to assembler for that matter? C, C++, Java, Smalltalk and Ruby are all high level languages. Assembler is, well, assembler and machine code is machine code. Those are three steps in the evolution of programming languages not seven. The differences in - whatever metric - between high-level languages are negligible compared to their differences to assembler using the same metric. I guess that's what the post concludes in the end but it gets there in a bit of a strange way. Also - does anyone seriously consider those vague metrics when making a decision of what language to choose? "How much does my language improve productivity over Java"? Pragmatically speaking, either you 're in charge of your project so you choose the language that seems to offer some advantage for the targeted platform, or you're not so you suck it up and code in whatever your shop uses.
- alkonaut 10y agoMisses the point that languages aren't as important as tools and ecosystems. With JS the stdlib train already left With C++ I doubt we'll see a nice module system and package repo similar to Rust (because we staple more legs to the dog in the name of backwards compatibility instead). We invent new languages not merely because we want a better language but because we want a better ecosystem, and each language gets just one or two shots at getting it right. Rust is aimed at C++ (and others) and offers a saner module and dependency system. It might seem like a crazy idea to offset C++ in the systems programming space - until you realize that it seems easy compared to adding modules to C++.
- venomsnake 10y agoI think that we have solved how to write programs. The biggest gains will be for solving how to write correct programs. Haskell is pushing hard in that direction.
- jbverschoor 10y agoJava is very verbose. Although many languages are moving towards the same constructs. The BIG differentiator is how a framework handles the write-compile-run-debug cycle. Rails is very nice in that respect. When I was doing a lot of java I'd run the server in debug mode, so eclipse could hot-swap code. Cycle was instant compared to a few minutes As for the "productivity" examples of 5% and 10%.. That's way too little.
- TeMPOraL 10y agoYeah. It's sad that most languages can't handle write-compile-run-debug cycle right. That is, it's sad they have an explicit cycle like that at all. I tend to switch back and forth between Java (at work) and Lisp (after work), and the workflow in Java annoys me to no end. It's so much easier and faster to write when you can compile-in new functions, methods and classes (or hot-swap existing ones) in a running program, while inspecting it at the same time. It's hard to go back from the convenience of having write-compile-run-debug cycle all blended into one.
- carterehsmith 10y agoDid you try something like JRebel? It does allow you to add/change/rename/remove methods and fields, on the fly. I've been using it for some years and it does cut on restarts big time. Commercial license (that your employer pays for) is ~$500/year/developer. Or you can try something like https://github.com/HotswapProjects/HotswapAgent https://github.com/HotswapProjects/HotswapAgent, that is a modified JVM that supposedly (I did not try it yet) does the same, and it is open source.
- ajdlinux 10y agocf Fred Brooks, "No Silver Bullet - Essence and Accident of Software Engineering", 1986
- kstenerud 10y agoIf I were in this conversation, it would turn a bit like this: "It's kind of complicated..." "I need a number." "I'm not giving you a number." "Why not?" "Ask me an intelligent question and I'll give you an intelligent answer." "What??" "On the day we use horsepower as the sole measure of a car, I'll give you a sole measure of a programming language."
- zaro 10y agoWell he kind of has point. If you think about it, with all these tools that make so much more productive we actually work more than people did in the 50s.
- paulus_magnus2 10y ago> compile times for Java are effectively zero Compile of a single class yes, but most J2EE projects I worked on compile between 10-20minutes including tests. Sometimes longer, a lot longer... While writing code in some languages is slightly faster than in others but most probably by less than a factor of 2 (provided you're using the right IDE and know what you're doing). The increase in productivity we can achieve is "standing on the shoulders of giants": ie. assembling / wiring together pre-existing bigger and bigger pieces of code we can trust and know how to use. Also more and more problems are solved and in public domain. IDEs usually These days