13 ms·
-2000 Lines of code (2004)
- kaoD 1y agoCode is not an asset, it's a liability.
- daitangio 1y agoSoftware metric are hard, indeed :) Be prepared in a ai-code world when more code does not mean better code.
- uaas 1y agoThis is also true for human code, more often than not.
- bunderbunder 1y agoI've been watching my colleagues' adoption of Copilot with interest. From what I can tell, the people who are the most convinced that it improves their productivity have an understanding of developer productivity that is very much in line with that of the managers in this story. Recently I refactored about 8,000 lines of vibe-coded bloat down into about 40 lines that ran ten times as fast, required 1/20 as much memory, and eliminated both the defect I was tasked with resolving and several others that I found along the way. (Tangentially, LLM-generated unit tests never cease to amaze me.) The PHBs didn't particularly appreciate my efforts, either. We've got a very expensive Copilot Enterprise license to continue justifying.
- api 1y agoI see a stratified software market in the future. There will be vibe and amateur banged out hustle trash, which will be the cheap plastic cutlery of the software world. There will be lovingly hand crafted by experts code (possibly using some AI but in the hands of someone who knows their shit) that will be like the fine stuff and will cost many times more. A lot of stuff will get prototyped as crap and then if it gets traction reimplemented with quality.
- doesnt_know 1y agoThis was said about large frameworks like electron on the desktop, but outside of some specific technical niches it literally doesn’t matter to end users.
- kbelder 1y agoIt does matter and they do care; they just don't have the specific technical knowledge to pinpoint why their computer sucks now.
- whatevertrevor 1y agoAnd why it takes months to years to fix basic bugs that have been acknowledged by the developer.
- librasteve 1y agoyeah this is it ...
- Miraste 1y agoWhere's the part where it's different from the existing market?
- api 1y agoWhat I meant was that the contrast will become much more extreme, like the difference between fine silverware and bulk plastic cutlery from Wal-Mart. Pre-vibe-coding it was more like the difference between fine silverware and cheap stamped metal stuff.
- bitwize 1y agoBack in the day, if you went to a website you could always tell who wrote their HTML by hand and who used a tool like GruntPage, Dreamweaver, etc. even without looking at the META tags. The by-hand stuff was like a polished jewel that had only as much layout, styling, and markup as needed to get the desired effect. The proprietary web editor stuff was encrusted with extraneous tags and vendor-specific extensions (like mso: attributes and styles in GruntPage). Then as now, if you let the machine do the thinking for you, the result was a steaming mess. Up to you if that was accessible (and for many, it was).
- switchbak 1y ago"8,000 lines of vibe-coded bloat down into about 40 lines" ... I just saw a vision of my future and shuddered. I mean, I like killing crappy code as much as the next guy, but I don't want that to be my daily existence. Ugggh.
- 0cf8612b2e1e 1y agoI would love to know the time balance between the two activities. It takes nothing to generate slop, but could be weeks to extricate it.
- Izikiel43 1y ago> Tangentially, LLM-generated unit tests never cease to amaze me. In a good or bad way? I've found AI pretty helpful to write tests, specially if you already have an existing one as a template.
- bunderbunder 1y agoI guess it depends on how much you like things like well-obfuscated smoke tests and mocks that don't accurately simulate relevant parts of the behavior of the module they're mocking.
- 2muchcoffeeman 1y agoI don’t believe your numbers unless your colleagues are exceptionally bad programmers. I’m using AI a lot too. I don’t accept all the changes if they look bad. I also keep things concise. I’ve never seen it generate something so bad I could delete 99 percent of it.
- WD-42 1y ago90%+ is a stretch. Anecdotally I have cleaned up a vibe coded PR and removed at least half of the code. The thing with the LLM is that often they will make some decision up front that has downstream ramifications for how the entire project's code is structured. I don't think I've seen an LLM re-visit it's assumptions, instead they code around them. In the case I saw, it was rust code and the LLM typed some argument as a Arc<Mutex<_>> when it absolutely did not need to, which caused the entire PR to inflate. The vibe coder apparently didn't catch this and just kept it vibing... Technically the code did what it needed to do but was super inefficient. It would have been easy for me to just accept the PR. It technically worked. But it was garbage.
- 2muchcoffeeman 1y agoYes. This is why I’m still “designing” projects and asking fairly specific things most of the time. But it’s pretty obvious when it produces garbage. So you’d reject it there and then. At the very least code review will raise so many questions. How did 8000 lines make it into the code base?
- WD-42 1y agoI think you are over-estimating how much people care. If the code runs and provides the desired result, there are many, many people who will simply ship it. This is the bed we made for ourselves.
- akavi 1y agoI've never seen 8000 -> 40, but I have done ~10 kLoC -> ~600. Aggggressively "You can write Java in any language" style JavaScript (`Factory`, `Strategy`, etc) plus a whole mini state machine framework that was replaceable with judicious use of iterators. (This was at Google, and I suspected it was a promo project gone metastatic.)
- amluto 1y agoEvery now and then, in between reasonable and almost-reasonable suggestions, Copilot will suggest a pile of code, stylistically consistent with the function I’m editing, the extends clear off the bottom of the page. I haven’t been inspired to hit tab a couple times and try to reverse engineer the resulting vomit of code, but I can easily imagine a new programmer accepting the code because AI! or, perhaps worse, hitting tab without even noticing.
- bearjaws 1y agoThis is one of those stories that I am sure has happened, but when it comes to "and then they never asked him again le XD face" it's clearly just made up.
- Scuds 1y agomanagement could have decided on a process change. Simple as that. I get the sentiment though, "He blew management's mind so much they made an exception for him". But, Folklore.org is a bit less onanistic than ESR's jargon file.
- pwndByDeath 1y agoI've pulled stunts like this that makes management realize its easier to make an exception than to fight it
- sokoloff 1y agoWe had free soft drinks in the fridges at one place I worked. Cost-cutting measures were coming and I sent an email to all of engineering (including the VP) asking who wanted to join me in a shopping trip at 10AM to restock the fridge. In the email, I estimated that it would take between 60 and 90 minutes. Two carfuls of engineers left at 10AM sharp and returned a little before noon and restocked the fridges. That was the first and last time we had to do it, as the soft drinks returned the following week.
- _benton 1y agoI imagine management realized it was far cheaper to buy some soda than it was to lose 2 hours of work from multiple engineers
- sokoloff 1y agoThat was exactly the point of the protest that was couched as totally-not-a-protest. (I skipped clarifying in the GP post that they took the soft drinks out of the fridge and emailed the new policy, rather than merely being a little slow in restocking.)
- Scuds 1y agoThis being Lisa that's -2000 lines in 68k assembler. That's about as verbose as any real PL can ever get. For what it's worth, here's quicksort in 5 lines of haskell https://stackoverflow.com/questions/7717691/why-is-the-minimalist-example-haskell-quicksort-not-a-true-quicksort https://stackoverflow.com/questions/7717691/why-is-the-minim...
- qsort 1y agoNot true quicksort though :) That's the problem with comparing lines of code: you're comparing apples and oranges. In this case you aren't even solving the same problem.
- sreekotay 1y agoAre... are you comparing quicksort to... Quickdraw? Lol - ok that's genuinely funny :). slow clap
- kragen 1y agoThat's not quicksort, though, because it's not in place; the actual quicksort on that page is in https://stackoverflow.com/a/7833043 https://stackoverflow.com/a/7833043, which is 11 lines of code. That's still pretty concise. My own preferred concise, or at least terse, presentation of quicksort is http://canonical.org/~kragen/sw/dev3/paperalgo#addtoc_20 http://canonical.org/~kragen/sw/dev3/paperalgo#addtoc_20. How long would a quicksort (say, of integers) be in 68000 assembly? Maybe 20 lines? My 68000 isn't very good. The real advantage of writing it in Haskell is that it's automatically applicable to anything that's Ord, that is, ordered.
- duskwuff 1y ago> How long would a quicksort (say, of integers) be in 68000 assembly? About 70 lines, once you strip out the comments and blank lines. https://github.com/historicalsource/supermario/blob/9dd3c4be/base/SuperMarioProj.1994-02-09/Toolbox/StandardFile/StandardFilePACK.a#L6367-L6488 https://github.com/historicalsource/supermario/blob/9dd3c4be...
- 1y ago
- Meneth 1y agoNoScript link: https://www.folklore.org/Negative_2000_Lines_Of_Code.html https://www.folklore.org/Negative_2000_Lines_Of_Code.html
- xeonmc 1y agoThanks. @dang update URL?
- jfengel 1y agoIn college I worked for a company whose goal was to prove that their management techniques could get a bunch of freshman to write quality code. They couldn't. I would go find the code that caused a bug, fix it and discover that the bug was still there. Because previous students had, rather than add a parameter to a function, would make a copy and slightly modify it. I deleted about 3/4 of their code base (thousands of lines of Turbo Pascal) that fall. Bonus: the customer was the Department of Energy, and the program managed nuclear material inventory. Sleep tight.
- uticus 1y ago> make a copy and slightly modify it In addition to not breaking existing code, also has added benefit of boosting personal contribution metrics in eyes of management. Oh and it's really easy to revert things - all I have to do is find the latest copy and delete it. It'll work great, promise.
- 0cf8612b2e1e 1y agoI mean…when you have a pile of spaghetti, there is only so much you can do.
- travisgriggs 1y agoAsk for more staff, reorganize the team into a set of multiple teams, and hire more middle management! Win win for the manager.
- 8n4vidtmkvmk 1y agoAdd tests to the function as it exists today. Submit. Add new functionality, make sure tests still pass. Done. Updating a function here and there shouldn't require more staff.
- SkyBelow 1y agoThis implies adding tests that accurately capture all the nuances of the function and don't test the simplest logic need to hit code coverage. When we are talking someone new to the function, then this is about the same as asking them to learn the function so they can be sure they didn't make an error when they changed it. The benefit of tests is that they are written by the person creating the function originally who is most aware of the hidden dangers of it. I'm distrustful on unit testing as I've seen too many tests written to make code coverage numbers but that don't actually test the functions they are aimed at. A non-trivial number which run the function asynchronously and then report a successful run before the function even finishes executing, meaning that even throwing errors don't fail the tests (granted, part of that is on the testing framework for letting unexpected errors ever result in a pass).
- LAC-Tech 1y agoThis just depresses me. So many programmers back then spent time optimising algorithms. Now it's slop city.
- pkaye 1y agoI've been playing with Claude 4 Sonnet in VS Code and found it quite good. As part of the development plan, on its own it had included an optimization phase where it profiled my go code, identified some hot spots, and proposed ways to optimize it. For the most critical area, it suggested using a prefix tree which it wrote on the spot, adapted to my code, wrote benchmarks to compare the old and new version (5x improvement). Then it wrote specific tests to make sure both versions behaved the same. Then it made sure all my other tests passed and wrote a report on everything. There were three performance optimizations in total, one which I rejected because the gain was minimal for typical use case and there are still some memory allocation optimization which I have deferred with because I'm in the middle of a major refactor of the code. The LLM has already written down plans to restart this process later when I more time.
- efnx 1y agoI’d be wary of doing any but the most obvious optimisations without profiling. This goes for humans or AI.
- dang 1y agoRelated. Others? Negative 2000 Lines of Code (1982) - https://news.ycombinator.com/item?id=33483165 https://news.ycombinator.com/item?id=33483165 - Nov 2022 (167 comments) -2000 Lines of Code - https://news.ycombinator.com/item?id=26387179 https://news.ycombinator.com/item?id=26387179 - March 2021 (256 comments) -2000 Lines of Code - https://news.ycombinator.com/item?id=10734815 https://news.ycombinator.com/item?id=10734815 - Dec 2015 (131 comments) -2000 lines of code - https://news.ycombinator.com/item?id=7516671 https://news.ycombinator.com/item?id=7516671 - April 2014 (139 comments) -2000 Lines Of Code - https://news.ycombinator.com/item?id=4040082 https://news.ycombinator.com/item?id=4040082 - May 2012 (34 comments) -2000 lines of code - https://news.ycombinator.com/item?id=1545452 https://news.ycombinator.com/item?id=1545452 - July 2010 (50 comments) -2000 Lines Of Code - https://news.ycombinator.com/item?id=1114223 https://news.ycombinator.com/item?id=1114223 - Feb 2010 (39 comments) -2000 Lines Of Code (metrics == bad) (1982) - https://news.ycombinator.com/item?id=1069066 https://news.ycombinator.com/item?id=1069066 - Jan 2010 (2 comments) Note for anyone wondering: reposts are ok after a year or so (https://news.ycombinator.com/newsfaq.html https://news.ycombinator.com/newsfaq.html).In addition to it being fun to revisit perennials sometimes (though not too often), this is also a way for newer cohorts to encounter the classics for the first time—an important function of this site!
- j4pe 1y agoI am a simple man I see -2k lines of code, I upvote I've told this story to every client who tried schemes to benchmark productivity by some single-axis metric. The fact that it was Atkinson demonstrates that real productivity is only benchmarkable by utility, and if you can get a truly accurate quantification for that then you're on the shortlist for a Nobel in economics.
- cb321 1y agoImportant enough to re-state whenever it arises - once you have 2 or more axes/dimensions, you no longer have a linear ordering. You need to map back to a number line to "compare". This is the motivation or driving force toward your "single axis". { That doesn't mean it's a goal any easier to realize, though. I am attempting to merely clarify/amplify rather than dispute here.. }
- conartist6 1y agoI think of this story every time I see a statistic about how much LLMs have "increased the productivity" of a developer
- Chris_Newton 1y agoOr the current industry favourite, “X% of our new code is now written by AI!”
- cb321 1y agoLOL. There was a time when people were excoriated for committing generated object code into version control..
- Cthulhu_ 1y agoMicrosoft, the number being 30%; whether that's accurate is another matter. Twenty years ago people already used IDEs to generate boilerplate code (remember Java's getters/setters/hashCode/toString?) because some guy in a book said you had to.
- thomashop 1y agoI use AI to simplify code. My manifesto has always been code is debt. Works really well too.
- nyarlathotep_ 1y agoIn Google's case, outside of LLMs I've always wondered how much code was generated by the protocol buffer compiler.
- 1970-01-01 1y agoIncluding the cost to build and maintain new nuclear power plants takes developers' efficiency into absurdity.
- deleted 1y ago[deleted]
- tuveson 1y ago
- victoriana758 1y ago[dead]
- nickginger714 1y ago[dead]
- 6510 1y agoI often have a mental picture of the thing I need, I start writing it, get a bit "stuck" on architecture and think I could be using a ready made library for this. I find one or a few of them, look at the code (which is obviously more generic) and realize it's many times as large as I thought the entire project should be. With few exceptions the train of thought doesn't even reach the "Do I want to carry this around and baby sit it?" stage. Some how this continues to surprise me every time. These 5 lines are probably my favorite example. https://jsfiddle.net/gaby_de_wilde/c8bhcatj/7/ https://jsfiddle.net/gaby_de_wilde/c8bhcatj/7/
- bironran 1y agoOne of my best commits was removing about 60K lines of code, a whole "server" (it was early 2000's) with that had to hold all of its state in memory and replacing them with about 5k of logic that was lightweight enough to piggyback into another service and had no in-memory state at all. That was pure a algorithmic win - figuring out that a specific guided subgraph isomorphism where the target was a tree (directed, non cyclic graph with a single root) was possible by a single walk through the origin (general) directed bi-graph while emitting vertices and edges to the output graph (tree) and maintaining only a small in-process peek-able stack of steps taken from the root that can affect the current generation step (not necessarily just parent path). I still remember the behemoth of a commit that was "-60,000 (or similar) lines of code". Best commit I ever pushed. Those were fun times. Hadn't done anything algorithmically impressive since.
- ddejohn 1y agoSounds interesting. Have you written about it in more detail somewhere?
- bironran 1y agoSee https://news.ycombinator.com/item?id=44390701 https://news.ycombinator.com/item?id=44390701
- bbkane 1y agoWhat did the software product do?
- bironran 1y agoThe product was a CMDB, with great tech and terrible marketing.
- bravesoul2 1y agoNice when you turn an entire server into a library/executable.
- b0a04gl 1y ago
- vodou 1y agoA long time ago I was working in a big project where the PLs came up with the most horrible metric I've ever seen. They made a big handwritten list, visible for the whole team, where they marked for each individual developer how many bugs they had fixed and how many bugs they had caused. I couldn't believe my eyes. I was working in my own project beside this team with the list, so thankfully I was left out of the whole disaster. A guy I knew wasn't that lucky. I saw how he suffered from this harmful list. Then I told him a story about the Danish film director Lars von Trier I recently had heard. von Trier was going to be chosen to appear in a "canon" list of important Danish artists that the goverment was responsible for. He then made a short film where he took the Danish flag (red with a white cross) and cut out the white lines and stitched it together again, forming a red communist flag. von Trier was immediately made persona non grata and removed from the "canon". Later that day my friend approached the bugs caused/fixed list, cut out his own line, taped it together and put it on the wall again. I never forget how a PL came in the room later, stood and gazed at the list for a long time before he realized what had happened. "Did you do this?" he asked my friend. "Yes", he answered. "Why?", said the PL. "I don't want to be part of that list", he answered. The next day the list was gone. A dear memory of successful subversion.
- fathomdeez 1y agoI'm having a lot of trouble visualizing both the flag and the list modifications.
- voidUpdate 1y agoThe danish flag is a white cross on a red background. If you cut out the white cross, you will be left with four rectangles of red, which can be pushed together and sewn up again, forming a solid red flag
- fathomdeez 1y agoI see. I was wondering where the hammer and sickle came in, since without those is it really a communist flag?
- kunley 1y ago"Every line of code not written is a correct one". One of the early Ruby Koans, IIRC, circulated on comp.lang.ruby around 2002
- __turbobrew__ 1y agoShould have said “Every line of Ruby code not written is a correct one”
- kunley 1y agoI nominate Java for that particular category
- charcircuit 1y agoJust because lines of code is being reported it didn't mean that bigger automatically means better. It does tell a story about how one is spending their time though.
- abraxas 1y agoAn old Dilbert cartoon had the pointy haired boss declare monetary rewards for every fixed bug in their product. Wally went back to his desk murmuring "today I'm going to code me a minivan!"
- LordDragonfang 1y agohttps://i.imgur.com/tyXXh1d.png https://i.imgur.com/tyXXh1d.png My manager has it pinned on the breakroom wall.
- bravesoul2 1y agoSorry what's the minivan reference?
- angus-g 1y agoI assume a cycle of write bug -> fix bug -> get paid until they can afford a new car!
- amoshebb 1y agoit's just a stand-in for "expensive but relatable purchase". He's saying "I'm about to write so many bugs that the sum reward will be in the tens of thousands"
- windward 1y agoIt's also foolish. Any true PHB has caps on bonuses linked to output that would be too low to enable a minivan.
- bombcar 1y agoIt would have been a sports car but Wally’s not the type.
- pjdesno 1y agoThe strip came out in 1995, at the peak of the minivan boom, with around 1.3M units sold that year.
- Arch-TK 1y agoI am currently working on a piece of code which I am actively trying to simplify and make smaller. It's not a piece of code which has any business ever getting larger or having more features. The design is such that it is feature complete until a whole system redesign is required at which point the code would be itself wholesale replaced. So I am sitting here trying to codegolf the code down in complexity and size. It's not just important to keep it simple, it's also important to keep it small as this bit of code is, as part of this solution, going to be executed using python -c. All the while not taking the piss and making it unreadable (I can use a minifier for that).
- Kinrany 1y agoRewrite it in Rust, haha.
- ivanjermakov 1y agoJust today I commited a +0-2kLOC change, removing two months of my coworker's contribution, because it had to be rewritten. Best feeling ever.
- bravesoul2 1y agoAdding that code was not a waste even. You don't have to work every line of code like a mule. Code ...is... thinking.
- jaydeegee 1y agoIn an old ops role we had a metric called ticket touches. One of my workmates had almost double of everyone else but only for that metric. We had a look and it was due to how he wrote notes in tickets instead of putting all his findings in a comment he would do it incrementally as he went along. Neither of these ways were wrong it just inflated that stat for him.
- deleted 1y ago[deleted]
- fathomdeez 1y agoI am net negative in lines of code added to two different companies I've worked for. I wear that proudly.
- runfaster2000 1y agoThis is a good example[1] at 64k LOC removal. We removed built-in support for C# + WinRT interop on Windows and instead required users to use a source-generation tool (which is still the case today). This was a breaking change. We realized we had one chance to do this and took it. [1] https://github.com/dotnet/runtime/pull/36715/files https://github.com/dotnet/runtime/pull/36715/files
- deleted 1y ago[deleted]
- b0a04gl 1y ago[flagged]
- mapmeld 1y agoBefore a recent annual performance review, I looked over my stats in the company monolith repo and found out I was net-negative on lines of code. That comes mostly from removing auto-generated API code and types (the company had moved to a new API and one of my projects was removing v1) but it was quite funny to think about going to work every day to erase code.
- mindesc 1y agoThis is how you turn unwanted dependencies and inability to make string searches a virtue.
- strathmeyer 1y agoA manager asking you to tell them how many lines of code you wrote is peak middle-management. Like what are you even doing, you count them.
- klntsky 1y agoA more realistic end of the story would be that the form refused negative numbers so he had to put 0 and got fired.
- djfivyvusn 1y agoGot laid off recently due to basically this.
- eCa 1y agoThis being 1982 I’ve never even considered that the form could be anything but paper.
- JdeBP 1y agoIt being 1982 and a story about the lead developer of LisaGraf, working on that very thing, it is certainly unlikely to be a GUI form. But block mode terminals that did forms had been a thing for over a decade at that point. Not that this was likely at Apple. But there are definitely contemporary ways in which one could have been entering this stuff via a computer. Indeed, an IBM 3270 could be told that a field was numeric. This wouldn't have the terminal prevent negative numbers. The host would have to have done that upon ENTER. But the idea of unsigned numbers in form data had been around in (say) COBOL PIC strings since the 1960s. * https://ibm.com/docs/en/cics-ts/5.6.0?topic=terminals-3270-field-attributes https://ibm.com/docs/en/cics-ts/5.6.0?topic=terminals-3270-f...
- mavhc 1y agoHe put in -2000, and it recorded it as 4294965296
- meepmorp 1y agoin 1982, I'd expect 63536
- LeifCarrotson 1y agoNo, this was Bill Atkinson. He's famous enough to have his own Wikipedia page: https://en.wikipedia.org/wiki/Bill_Atkinson https://en.wikipedia.org/wiki/Bill_Atkinson > Bill Atkinson, the author of Quickdraw and the main user interface designer, who was by far the most important Lisa implementer... > I'm not sure how the managers reacted to that, but I do know that after a couple more weeks, they stopped asking Bill to fill out the form, and he gladly complied. Notice that it doesn't say "they stopped using the form" but "they stopped asking Bill to fill out the form". The rules are different at the top, they probably still used it to mis-manage junior employees who didn't have as much influence.
- jbverschoor 1y agoSome theories will cause you have a negative performance review and will be fired haha
- BnnRGa 1y ago[dead]
- zkmon 1y agoGreat collection of stories! Thanks for sharing. I got carried away across the pages and relished the quotes page. The ideals probably worked for that time and that place. Many places in other parts of the world and at other times, would have different ideals, to deal with different priorities at that time and place. America in the 80's had no survival struggle, wars, cultural stigmas, pandemics or famines. Literacy and business were blooming. Great minds and workers were lured with great promises. A natural result is accelerated innovation. Plenty of food and materials. Individualism, fun and luxury was the goal for most. The businesses delivered all of it. Personal computing was an exact fit for that business.
- kookamamie 1y agoLines of code is a byproduct, not the goal. Code is an artifact, undesired debris. The fewer lines, the better.
- Koffiepoeder 1y agoWell, like everything it's probably a balance to strike. Otherwise you may end up with highly golfed IOCCC-style code in production, which I would definitely not recommend.
- _Algernon_ 1y agoI've seen advent of code one-liners, and sometimes more lines is better than a one-liner.
- kookamamie 1y agoYes, my thinking here isn't about the semantics of code, whether it is written in dense or terse form, but about the more meta level - code itself is something we write to achieve some goal, it shouldn't be the goal by itself. As an example, as a company is audited for their valuation, it is not the code amount itself that is valuable. In many ways it can be seen as a burden, as you'll need to maintain code over time.
- rottc0dd 1y agoHi, I think I have mentioned this before in HN too. I am not from CS background and just learnt the trade as I was doing the job, I mean even the normal stuff. We have a project that tries reify live objects into human readable form. Final representation is so complicated with lot of types and the initial representation is less complicated. In order to make it readable, if there is any common or similar data nodes, we have to compare and try to combine them i.e. find places that can be made into methods and find the relevant arguments for all the calls (kind of). Initial implementation did the transformation into the final form first, and then started the comparison. So, the comparison have to deal with all the different combinations of the types we have in final representation now, which made the whole thing so complex and has been maintained by generation of engineers that nobody had clear idea how it was working. Then, I read about hashmap implementation later (yep, I am that dumb) and it was a revelation. So, we did following things: 1. We created a hash for skeleton that has to remain the same through all the set of comparisons and transformation of the "common nodes", (it can be considered as something similar to methods or arguments) and doing the comparison for nodes with matching skeletal hashes and 2. created a separate layer that does the comparison and creating common nodes on initial primitive form and then doing the transformation as the second layer (so you don't have to deal with all types in final representation) and 3. Don't type. Yes. Data is simplest abstraction and if your logic can made into data or some properties, please do yourself a favor and make them so. We found lot of places, where weird class hierarchies can be converted into data properties. Basically, it is a dumb multi pass decompiler. That did not just speed up the process, but resulted in much more readable and understandable abstractions and code. I do not know, if this is widely useful but it helped in one project. There is no silver bullet, but types were actual problem for us and so we solved it this way.
- dgan 1y agoyesterday I deleted 2500 lines out of a project of 4300 lines lol. I have mixed feelings because now it's so much simpler, but the frustration of having to write these lines in the first place, it's so annoying. that's what happens when specs aren't clear
- rossant 1y agoI think lines of code could be an interesting and valuable metric. If the lower (negative) score, the better (given a fixed set of features). “Perfection is achieved, not when there is nothing more to add, but when there is nothing left to take away.” ― Antoine de Saint-Exupéry, Airman's Odyssey
- entuno 1y agoThat just encourages bad behaviour in the other direction though. A massive multi-level nested ternary on one line is usually going to be worse than a longer but clearer set of conditions. Trying to make code brief can be good, but it can often result in an unmaintainable and hard to read mess.
- windward 1y agoThat results in the same AST, it's not really taking anything away
- einsteinx2 1y agoExcept for readability
- Cthulhu_ 1y agoYou'll never get it right though. Focusing on "features per LOC" means people will write shorthand, convoluted code, pick obscure, compact languages, etc. To use an adage, if a metric becomes a target, it stops being a useful metric.
- impostervt 1y agoAbout 1.5 years ago I inherited a project with ~ 250,000 lines of code - in just the web UI (not counting back end). The developer who wrote it was a smart guy, but he had never worked on any other JS project. All state was stored in the DOM in custom attributes, .addEventListeners EVERYWHERE... I joke that it was as if you took a monk, gave him a book about javascript, and then locked him in a cell for 10 years. I started refactoring pieces into web components, and after about 6 months had removed 50k lines of code. Now knowing enough about the app, I started a complete rewrite. The rewrite is about 80% feature parity, and is around 17k lines of code (not counting libraries like Vue/pinia/etc). So, soon, I shall have removed over 200,000 loc from the project. I feel like then I should retire as I will never top that.
- motorest 1y ago> The rewrite is about 80% feature parity, and is around 17k lines of code (not counting libraries like Vue/pinia/etc). This is exactly where these comparisons break down. Obviously you don't need as much code to get passable implementations of a fraction of all the features.
- sshine 1y ago>> is about 80% feature parity, and is around 17k lines of code You make a fair point that a basic framework can be expressed with much less code. And that the remaining 20% probably contains more edge cases with proportionally more code. But do you think the last 20% will eventually make up anywhere near 233k lines of code? The real save here comes from rewriting: seeing all the common denominators and knowing what's ahead.
- Philip-J-Fry 1y agoIt's definitely a good argument for not reinventing the wheel though. I'd rather have 250,000 lines of code but 230,000 of that is in battle tested libraries. And of which only 20,000 lines are what we ever need to read/write.
- vendiddy 1y ago
- justtinker 1y agoIn the days when perl was the language of choice for the web I got a 97% reduction in code size. I was asked to join a late project to speed it up. (Yes I know that has low success rate). The lead dev was a hard core c programmer and had no perl experience before this job. He handed me a 200 line uncommented function that he wrote and was not working. It was a pattern matcher. I replaced it with 6 lines of commented perl with regex that was very readable (for a regex). Since he had no idiomatic understanding of perl he did not accept it and complained to management. We had to bring in the local perl demigod to arbitrate(at 21 was half my age at the time, but smart as a whip). Ruled in my favor and the lead was pissed.
- ryao 1y agoWas he unaware of regex.h? https://www.man7.org/linux/man-pages/man3/regcomp.3p.html https://www.man7.org/linux/man-pages/man3/regcomp.3p.html
- sgerenser 1y agoDoing regex in C back in the day was not very common and far from idiomatic, unlike perl where its basically expected that you cram regexes in anywhere you can.
- insane_dreamer 1y agoWhen using Claude for production code in my core code base, I'm much more picky about _how_ it's written (as opposed to one-off or peripheral code that just needs to work). I find much of my work involves deleting Claude's code and simplifying its logic. (I'm still not sure I'm saving any time in the end vs writing such code from scratch.)
- awinter-py 1y agothis must be paired with the '350k lines / then he discovered loops' post from the same site https://folklore.org/Discovered_Loops.html https://folklore.org/Discovered_Loops.html
- Feathercrown 1y agoI did this the other day in an old component that had been refactored several times. It's incredibly satisfying. IMO removing code is often more important than adding it because it helps so much with maintainability and future development speed.
- tregoning 1y agoThere are still companies asking for # of lines of code written https://x.com/tregoning/status/1286329086176976896 https://x.com/tregoning/status/1286329086176976896
- jjice 1y agoThis is great actually! It's short-circuit evaluation for me to not waste my time applying.
- Xeoncross 1y agoWould be really interesting if microservices were limited to a manageable amount of code. I wonder if technical leadership has ever guided their org devs that services shouldn't be more than ___ lines of code (excluding tests). Obviously, more services would mean more latency, but I'm pretty sure this one I'm working on now that is over 11k LOC (ignoring comments) could be replicated with a few bash commands.
- lpapez 1y agoThat sounds even worse honestly. One of the criticisms of microservices is that factoring a system correctly is already a hard problem, and introducing a network call between them makes it even harder. Enforcing service LoC limits is equivalent to forcing further factoring of a system, which might not be necessary, especially not into a microservice arch. Sometimes code is tightly coupled because it needs to be tightly coupled.
- Ensorceled 1y agoWe had a VP recommend "lines of code" as part of performance system. I showed some CVS stats of some of our key developers; one of our best performers was at -20K lines of code over 5 years.
- jarofgreen 1y ago> I'm not sure how the managers reacted to that, but I do know that after a couple more weeks, they stopped asking Bill to fill out the form, and he gladly complied It would be a much better story if they stopped asking everyone to fill out the form.
- dml2135 1y agoI've become something of the guy that's the main code remover at my current job. Part of it is because I've been here the longest on the team, so I've got both the knowledge and the confidence to say a feature is dead and we can get rid of it. But also part of it is just being the one to go in and clean up things like release flags after they've gone live in prod. I'm trying to socialize my team to get more in the habit of this, but it's been hard. It's not so much that I get pushback, it's just that tasks like "clean up the feature flag" get thrown into the tech debt pile. From my perspective, that's feature work, it just happens to take place after the feature goes live instead of before. But it's work that we committed to when we decided to build the feature, so no, you don't get to put it on the tech debt board like it was some unexpected issue that came up during development. Curious to hear other perspectives here, I do worry that I'm a bit too dogmatic about this sometimes. Part of it maybe comes from working in shared art / maker spaces a lot in the past, where "clean up your shit" was rule #1, and I kind of see developers leaving unused code throughout the codebase for features they owned through the same lens.
- slippy 1y agoCleaning up of feature flags was something that I excelled at failing to do. If you are the one cleaning them up, then you sir deserve a raise. Don't question it. It's a service.
- MetaWhirledPeas 1y ago> I do worry that I'm a bit too dogmatic about this sometimes I haven't seen a lot of other good suggestions for how to accomplish this, so maybe you're being just the right amount of dogmatic.
- akdor1154 1y ago> the tech debt board Taking you to literally mean you have a separate board for tech debt, that's your problem right there.
- dml2135 1y agoWell, we prioritize amongst the tech debt on that board and then move it onto the main board for sprint, it's not like it's a completely separate process. Things do go there to die sometimes though.
- vendiddy 1y agoOne habit I've gotten into is trying to aim for negative LOC pull requests on occasion. It has the added benefit that I'm forced to keep the codebase fresh in my mind.
- jtfrench 1y agoWord on the street is that non-existent code doesn't crash.