[HN Gopher] Ask HN: What are some of the most elegant codebases ...
___________________________________________________________________
Ask HN: What are some of the most elegant codebases in your
favorite language?
Your favorite language can be anything - Lisp, Python, C, Haskell,
etc. Which codebases are the most elegant ones written in your
favorite language that new comers to the language can learn
something from?
Author : debanjan16
Score : 155 points
Date : 2023-06-17 14:51 UTC (8 hours ago)
| bb86754 wrote:
| So many, I like reading how other people write code.
|
| R - sf package is a clean example of functional OOP
|
| Python - pytudes (Peter Norvig's notebooks)
|
| Haskell - Elm compiler. I could mostly understand what's going on
| even though I barely know any Haskell.
|
| Ruby - Sequel is really nice.
|
| Rust - Ripgrep
|
| Pretty much any F# codebase is super readable too.
| antonyt wrote:
| Do you have any F# favorites? People often mention jet.com
| repos, but I'm interested to hear about others.
| bb86754 wrote:
| Jet.com has a lot of good ones yeah. One I was looking
| through the other day is a GitHub repo under
| /ScottArbeit/Grace and it's an interesting take on version
| control. It was a pretty cool repo to look through. To make
| it easier though, remember that F# source code files are all
| "in order" so you read them from top down, which Github
| doesn't currently have functionality for.
| lygaret wrote:
| For folks coming here later, you can figure out the order
| that you should view them in by reading into the `.fsproj`
| file, which will lay out compile units in order.
| soulbadguy wrote:
| +1 on F#, highly under-rated language IMHO.
| bgia wrote:
| C++: ClickHouse. It is very readable and easy to navigate. Call
| stacks that you pick up in logs are very descriptive, and you can
| easily tell what went wrong.
| akkartik wrote:
| Some past threads for dang to macroexpand:
|
| https://news.ycombinator.com/item?id=33413124
|
| https://news.ycombinator.com/item?id=32384769
|
| https://news.ycombinator.com/item?id=25355171
|
| https://news.ycombinator.com/item?id=15663980
|
| https://news.ycombinator.com/item?id=18037613
|
| https://news.ycombinator.com/item?id=14836013
|
| https://news.ycombinator.com/item?id=34205294
|
| https://news.ycombinator.com/item?id=13624926
|
| https://news.ycombinator.com/item?id=16960300
| agjmills wrote:
| Php and Laravel
| jpb0104 wrote:
| Really enjoyed reading through kbin as a Symfony fan.
| https://codeberg.org/Kbin/kbin-core
| vimsee wrote:
| I`ve seen so many posts and comments about Laravel and how it
| has made PHP a modern choice for webdev.
|
| As someone who has written many small apps in PHP, I might dive
| into it and finally see what that Laravel thing is all about.
| zeroego wrote:
| I'm currently using Laravel at work. It's very opinionated,
| and some folks say it uses anti-patterns with regards to its
| use of facades. That being said my last job was C#/.Net and I
| am so much more productive with Laravel. It really allows you
| to develop quickly and I haven't yet bitten by any of the
| "anti-patterns". If you give it a shot I'd recommend just
| using Laravel Sail as, if you already have docker installed,
| you can have a full dev environment setup in less than 10
| minutes.
| nicoburns wrote:
| > It's very opinionated
|
| It is and it isn't. It does opinionated ways of doing
| things. But IMO what makes it so great is just how easy it
| is to opt out of the opinions you don't like. Facades are
| an excellent example of this: don't want to use them? Well,
| you don't have to (and IMO a really big app that may be a
| good choice - in a small app it likely won't matter and you
| might as well use them).
| frodowtf wrote:
| To me, "anti-pattern" has the same bogus meaning as "clean
| code"
| malux85 wrote:
| Although at a high level many of things things are
| subjective, this take is almost entirely wrong in every
| dimension.
|
| Anti-patterns are things like using a wrong data
| structure, using the wrong levels of abstractions,
| tightly coupling components so they are not composable,
| leaky interfaces, god objects doing too much
|
| The strict definitions of many of these can be subjective
| at the edges, but they all objectively exist and cause
| fragility, instability, inflexibility and maintenance
| problems in the systems built from them.
|
| Clean code is code that's easy to read, has the right
| level of abstractions, uses the right data structures and
| has the minimal possible anti-patterns in them (ideally
| zero!) above.
|
| Calling these things bogus is unfair, I grant they can be
| subjective in some places but they are prevalent in
| poorly designed systems especially by junior engineers.
|
| Wikipedia page on anti-patterns:
| https://en.m.wikipedia.org/wiki/Category:Anti-patterns
|
| There are project management anti patterns too
| https://en.m.wikipedia.org/wiki/Anti-pattern
|
| Anti patterns are real. Clean code is real. If you cannot
| see that, I would suggest reading a lot more codebases
| from open source projects (pick medium and large
| codebases, not trivial programs) and after 10 or so you
| will see obvious structural and quality differences, as
| well as hundreds of anti patterns and examples of clean
| code.
| frodowtf wrote:
| > Anti-patterns are things like using a wrong data
| structure
|
| What is a "wrong data structure"? Is it wrong to do
| linear scans when hash access would be sufficient?
|
| > ... using the wrong levels of abstractions
|
| When is the abstraction level wrong? I can name you at
| least 10 projects that avoid so called anti-patterns by
| introducing unecessary abstractions. Is something really
| an anti-pattern if it's "solution" massively reduces your
| development velocity but now everything is nicely
| composable?
|
| In my opinion, anti-patterns are either obvious
| (constantly using different names for the same thing) or
| totally subjective to the context (when to repeat
| yourself).
|
| But maybe I'm not able to put myself into the shoes of
| novices and a lot of things seem obvious to me. Granted.
| coryrc wrote:
| > What is a "wrong data structure"?
|
| I've seen people use multiple named arrays, search for
| something in the first array, then use its index to find
| matching data in the other arrays, instead of a
| dictionary of string:tuple.
|
| Another example is languages with arrays and vectors,
| usually one or the other is preferred. In Go you can use
| arrays but you're supposed to use slices whenever
| possible, while the opposite would be appropriate in,
| say, C.
| zeroego wrote:
| This is a solid argument, thanks for taking the time to
| write this out!
| nrdvana wrote:
| I'll agree with everything here except the clean code.
| Clean code is about optimizing human perception and there
| can't be a standard for that because humans think in a
| wide variety of ways and it's further impacted by the
| level of understanding the human already has on the
| subject matter the code is dealing with. One person's
| "clean code" can be another person's nightmare.
|
| I'll back this up with the example of Magento 1. It's a
| PHP e-commerce platform that has (at first glance) some
| of the cleanest code you'll ever see in PHP. It looked
| like the entire development team had come from a Java
| background. Every component was neatly divided into a PHP
| object with documented private and public methods. There
| was a clean MVC separation, with lots of shared behavior
| abstracted into "Helpers", and a Theme system handling
| the rendering of the front-end. I have no doubt that the
| authors of Magento prided themselves on how clean their
| code was. For them, having spent full-time careers
| structuring all the many features of their platform into
| these files, it probably did feel like a clean
| organization. And when I initially reviewed the code to
| evaluate using Magento, I also thought it was clean and
| was part of my choice to use it.
|
| The problem was that when you take something as complex
| as a full-featured e-commerce system and modularize it so
| thoroughly, you end up with a literal 7000 classes, and
| it becomes impossible to figure out the sequence of
| execution of a single page request through that massive
| tangle. Is it "clean code" if I have to add debugging
| print statements to 57 source files to figure out the
| path of execution that renders a single page?
|
| If I had to choose a circle of hell where I would edit
| Cyrus IMAP (the worst C code ever) for the rest of
| eternity, or edit Magento for the rest of eternity, I
| think I would actually choose Cyrus.
| zeroego wrote:
| That's an interesting take! I'm still early in my career
| and I ask with genuine curiosity, but why do you think
| "clean code" has a bogus meaning?
| rjh29 wrote:
| I suggest you read malux85's comment:
| https://news.ycombinator.com/item?id=36371733
| spion wrote:
| Not the OP, but clean code misses the point. Its is very
| subjective and depends on one person's previous
| experience and patterns they've been exposed to.
|
| "Reasonably readable" is what I strive for nowadays, and
| a key aspect is that I no longer think there is an
| objective measure for it. It depends on the team/company
| you're in, and its important to keep in mind that the
| goal is to effectively communicate the program to them.
| [deleted]
| Contortion wrote:
| Also Carbon. It makes working with dates and times (something
| which is by it's very nature a PITA) actually enjoyable and
| easily readable.
|
| I also really appreciate FakerPHP for how easy it is to
| generate realistic fake values.
| freedomben wrote:
| For C, I've really enjoyed reading the Ruby source code. There
| are good and bad spots, but overall especially if you know Ruby
| the language, the source is both entertaining and enlightening.
| zh3 wrote:
| RT-11 on the PDP-11 (all in PDP-11 assembler). Back in the early
| 80's you could rebuild it in several different ways, depending on
| whether you wanted it "single job" (as it was back then) or not.
|
| As an example, here's the PDP-11 assembler to convert a binary
| number to decimal ASCII (no idea who wrote it, but they certainly
| made every word count):- CNV10: MOV R0,-(SP)
| ;Subroutine to convert Binary # in R0 1$: CLR R0
| ;to Decimal ASCII by repetitive INC R0
| ;subtraction. The remainder for each 2$: SUB
| #10.,@SP ;radix is made into ASCII and pushed
| BGE 1$ ;on the stack, then the routine calls
| ADD #72,@SP ;itself. The code at 2$ pops the ASCII
| DEC R0 ;digits off the stack and into the out-
| BEQ 2$ ;put buffer, eventually returning to
| CALL CNV10 ;the calling program. This is a VERY
| MOVB (SP)+,(R1)+ ;useful routine, is short and is
| RETURN ;memory efficient.
|
| Courtesy bitsavers.org
| (http://www.bitsavers.org/pdf/dec/pdp11/rt11/v5.6_Aug91/AA-PD...)
| diego_moita wrote:
| C -> Lua, Sqlite
| neonsunset wrote:
| [C#] Bitwarden server repository is probably one of the cleanest
| (non-novel) solution architectures I have seen so far. I always
| point people to it as learning material for structuring the code.
| It is not the most minimalistic but I feel like it strikes very
| good balance and does not follow blindly all the """fancy""" OOP
| patterns people should never use anyway.
|
| https://github.com/bitwarden/server
|
| Otherwise, I can see why people are burned, average Java/C#
| codebases look abysmal and written without understanding of (not)
| using heaps of mediator/factory/adapter/provider classes.
| valenterry wrote:
| fs2 (reactive streaming, https://github.com/typelevel/fs2)
| written in Scala. It shows how nicely things can compose in a
| typesafe way if the language supports it.
|
| And then, the opposite is Monix (https://monix.io/) also written
| in Scala. It's also about reactive streaming and the API is
| great, but the internal code is ugly because it sacrifices
| readability/composability for performance.
| Waterluvian wrote:
| Back when I was starting out, it was nice that Backbone had such
| clean, well-commented code:
| https://github.com/jashkenas/backbone/blob/master/backbone.j...
| rudasn wrote:
| Indeed! jQuery as well, before the breakup into modules.
| jcpst wrote:
| I really liked reading the source for underscore as well.
| w10-1 wrote:
| I'd nominate Java itself.
|
| In the decades Java sources have been available, any of the
| kazillion junior programmers could debug-step into java.* and see
| exactly what's happening -- progressive disclosure at its finest
| for building expertise.
|
| Most other languages have a hard boundary, so the roots of
| language are a matter of conceptual documentation and experience.
| Java also offers that fly-over knowledge, but when problems
| arise, programmers love knowing exactly and seeing directly.
|
| Personally, in a pinch I prefer the actual to the elegant.
| ldjkfkdsjnv wrote:
| After a decade of programming 50+ hours a week in many
| languages (typescript, javascript, python, scala, java, lua,
| bash, c++, etc), I have come to the conclusion that Java is
| simply the best. The tooling, libraries, stability, verbose
| rigidity. It forces a style of programming that simply scales
| to more engineers better
| lockhouse wrote:
| As an end user though, I honestly can't think of any Java
| software I actually enjoy using. Minecraft? That's literally
| the only thing that comes to mind.
| foobarbecue wrote:
| Have you tried Jetbrains stuff?
| lockhouse wrote:
| I have. Maybe I don't have enough RAM for it, but I find
| their IDEs to be slow and laggy.
|
| Xcode and Visual Studio Code feel so much snappier on the
| same machine.
| 29athrowaway wrote:
| https://github.com/EnterpriseQualityCoding/FizzBuzzEnterpris.
| ..
|
| On a more serious note, most Java code on Github is now
| written by Copilot.
| winrid wrote:
| Have you tried C#? It looks a lot nicer to work with than
| Java.
| watermelon59 wrote:
| The ecosystem is nowhere near as mature though. I don't
| work with either anymore but back in 2017 I made the switch
| from C# to Java and it felt like a breath of fresh air when
| it came to the maturity and capability of JVM tooling
| compared to what's available for .NET.
| ablob wrote:
| I'm curious, what kind of tooling are we talking about?
| winrid wrote:
| Interesting. Did you try Jetbrains Rider as an IDE?
| AtlasBarfed wrote:
| In javaland, the actual ideal is somewhere in the feature set
| supported by Groovy. CompileStatic groovy is probably the
| best, you get a lot of good features for no performance hit.
| [deleted]
| stickfigure wrote:
| While I think there's a lot to love about Java, I think the
| standard library itself is not an especially great role model.
| Most of it was written a long time ago and has a fairly
| antiquated style - lots of mutable state, nullability, and
| checked exceptions. Not that the library isn't an incredible
| asset - it's luxuriously rich compared to working in Node.js -
| but if it were written from scratch today, I suspect it would
| look fairly different. Eg, the collection classes would use
| Optional and have separate read/write interfaces.
|
| For an example of "modern Java" I would point at something like
| this (which I wrote, sorry about the hubris):
|
| https://github.com/stickfigure/hattery
| diarrhea wrote:
| Yes. I have been burned by this in C#, it's very frustrating.
| acedTrex wrote:
| you can step directly into System.* source as well...
| danap wrote:
| What else my own, Java, coding for over 50 years. If YOU can't
| figure out what your own code is doing after ten years of not
| looking at it then nobody else can either. Hint, Comment your
| thoughts as much as possible, to make things clear when there not
| to you.
|
| Format just like a book. Use full text variables, methods, class
| names. Don't start a project until you define your formatting.
| Stick to it! Do this and your documentation will be easy.
|
| "https://github.com/csanyipal/ajqvue/blob/master/src/com/dand..."
| freedomben wrote:
| This is pretty good! I'd be happy to work with you :-)
|
| There are undoubtedly some pointless comments, but there are
| some good ones too, and the code is understandable. I think the
| sibling comments are being overly harsh and are zeroing in on
| single examples and missing the forest for the trees.
|
| I suspect recommending your _own_ code as an example of the
| most elegant codebase is triggering to others, so there 's
| probably a negative initial reaction and probably a lot of
| people clicking your link so they can point out why you're
| wrong
| [deleted]
| rjh29 wrote:
| Anyone suggesting their -own- code as an example of the "most
| elegant codebase" is dubious. Practice some humility.
| travisjungroth wrote:
| I'd be a little forgiving if it was almost an art piece.
| Like, they spent a year making the most elegant JSON
| serializer possible.
| dasil003 wrote:
| Good structure overall and appreciate the summary at the top.
| For the inline comments more "why" and less "what" would give
| higher signal-to-noise as a large percentage of that content is
| adding nothing that basic Java syntax and variable names don't
| already tell you.
| irl_chad wrote:
| A great example of how NOT to write Java. You say absolutely
| nothing with a whole lot of extra words.
|
| For example: //================================================
| ============== // Ajqvue Constructor //========================
| ====================================== public
| Ajqvue()
|
| The constructor definition is already clear, I don't need a big
| header telling me what a constructor is.
|
| Instead, use comments generously where needed - for example, if
| you have a piece of business logic, a comment explaining the
| intent behind it can help the maintainer (likely you) a year
| down the road. What I mean by this, is that what your code DOES
| should be self evident - but documenting the business decision
| behind the implementation has done wonders for me.
| Blahah wrote:
| The getWebsite method comment says it returns the version.
| That's an example of how not to comment - totally pointless and
| misleading if it diverges from the code. The code is nice and
| clear without the comments.
| wewxjfq wrote:
| At the beginning of the year I was rewriting a SPA and looking
| for ideas on how to structure a web app. One project I looked at
| was Github Desktop and I think it has very clean code for an app.
|
| https://github.com/desktop/desktop
| Solvency wrote:
| Now if only GitHub desktops actual UI/UX wasn't a poorly
| thought out mess of anti-patterns and anti-design.
| tdba wrote:
| I use it daily and it works great. It doesn't do all that
| much, but what it does do saves me a bunch of time. I reach
| for the git CLI when something goes wrong, but that's not
| often.
| rjh29 wrote:
| What's wrong with it?
| mredigonda wrote:
| Thanks for recommending this, I just browsed some files online
| and it's looking indeed amazing.
|
| P.S. It's now easy to check a repo file by replace .com with
| .dev: https://github.dev/desktop/desktop
| batperson wrote:
| You can also just click the . (period) key when viewing any
| repo.
| NicoJuicy wrote:
| My own ( c# ). It's not opensource yet, monetizing it first.
|
| Full DDD, it was a refactor during COVID-19 for my ecommerce.
|
| It powers https://belgianbrewed.com
|
| Copy paste from: https://news.ycombinator.com/item?id=35257225
|
| > But I believe the project is much cleaner and frankly better to
| understand than all other projects i've encountered for this
| size. I'm using DDD, so DDD knowledge is a requirement to
| navigate this in a breeze :) :
|
| - https://snipboard.io/D03VWg.jpg - General overview of the
| architecture. Small fyi: Connectors => Autogenerated nugets to
| call the api's
|
| - https://snipboard.io/9M24hB.jpg - Sample of Modules +
| Presentation layer
|
| - https://snipboard.io/ybp6EH.jpg - Example of Specifications
| related to catalog ( = products )
|
| - https://snipboard.io/lE9vcK.jpg - How specifications are
| translated to the infrastructure ( here I'm using EF, so I'm
| using Expressions a lot), but plain old SQL is also supported. A
| query is basically a list of AND/OR Specifications where a
| hierarchy is possible. This would translate to "(QUERY 1 ) AND
| ((QUERY 2) AND (QUERY 3))" in the Infrastructure layer.
|
| - https://snipboard.io/7rVBpk.jpg - . In general, i have 2 List
| methods ( one for Paged queries and one not for Paged queries)
|
| Additional fyi: Is V2, so has some legacy code. Uses my own STS.
| Has 2 gateways ( the ShopGateway that is used to develop new
| sites and the BackendGateway for the Backend). Enduser frontend
| is in MVC for SEO purpose, Customer backend is in Angular ( SPA).
| The basket is a NoSql implementation on top of SQL server.
|
| The enduser frontend supports a hierarchy of themes ( so it's
| insanely flexible to create variations of pages for other
| clients).
|
| There are more projects involved outside of this solution, eg.
| nuget repo's usable accross solutions (JWT, Specifications, ...)
| and "plugins" for a standalone project that is installed for end-
| users for syncing local data. So it's +101 projects :)
|
| Edit: my specification implementation has been open-sourced here:
| https://github.com/NicoJuicy/Specification-Pattern-CSharp
|
| Someone was curious to see it.
| pizzapill wrote:
| Look at that subtle off-white coloring. The tasteful thickness
| of it. Oh, my God. It even has a watermark.
|
| Now lets see Paul Allen's screenshots of the directory
| structure of his codebase.
| NicoJuicy wrote:
| American psycho, lol.
|
| Ok, i get it.
|
| Just a shame that while i gave a pretty clear technical
| description on the "why i think so".
|
| Nobody of the downvoters actually cared to give a actual
| technical counter argument or even did a test with a
| technical question... Instead just a reply with a partial
| movie script...
|
| Ugh.
| mometsi wrote:
| "I just finished reading the greatest script I've ever read in
| my life."
|
| - "Oh, really? Who wrote it?"
|
| "I did."
| jeremycarter wrote:
| "What's the name of it?"
|
| ..."Lessons in humility"
| hn_throwaway_99 wrote:
| Back when I first was learning about GraphQL in 2016, I remember
| thinking the reference implementation in JavaScript was extremely
| clear, easy to read, and well organized. It had a "wow, I wish
| all the code I read was this good" feel to it for me.
| fastneutron wrote:
| Shewchuk's Triangle code for Delaunay mesh generation is some of
| the most elegant C-code I've ever seen [1]. It even won the SIAM
| Wilkinson Prize for numerical software at the time it was
| written. It's written in a literate style, and builds up from the
| most fundamental arithmetic operations and data structures, all
| the way to one of the most efficient mesh generators of its kind.
| He has a few other codebases written in a similar style [2, 3].
| It's very different from what you see in the wild, but it's been
| great for understanding what's happening under the hood for
| complex algorithms like mesh generation.
|
| 1. https://www.cs.cmu.edu/~quake/triangle.html
|
| 2. https://github.com/ctlee/Stellar
|
| 3. https://www.cs.cmu.edu/~quake/robust.html
| waterpowder wrote:
| gorilla.bas
| justsomehnguy wrote:
| CONST TRUE = -1 CONST FALSE = NOT TRUE
|
| https://web.archive.org/web/19990202113028/http://hem.passag...
| dadarecit wrote:
| Envoy proxy for C++
| fcantournet wrote:
| That's quite an indictment of C++. I concur but still.
| seneca wrote:
| I don't know if elegant is the word, but I often refer to the
| Hashicorp repos for Go, and specifically admire Mitchell's own.
| Very clean, well written code most of the time.
| szundi wrote:
| Swing in Java obviously
| personjerry wrote:
| Not sure if it's still the case but about 6 years ago Facebook's
| folly C++ library was something I'd point to for my junior
| engineers to get a sense of "good" C++
| https://github.com/facebook/folly
| crop_rotation wrote:
| Guava -> In Java
|
| Golang Stdlib -> Golang
|
| redis -> C
|
| anything by armin ronacher -> Python
| mepian wrote:
| For Lisp I would recommend Edi Weitz's CL-PPCRE:
| https://edicl.github.io/cl-ppcre/
|
| Pretty much anything else from Edi Weitz is also great.
|
| Mezzano is quite elegant in my opinion, especially for an
| operating system. For example, this is the USB mass storage
| driver:
| https://github.com/froggey/Mezzano/blob/master/drivers/usb/m...
| avindroth wrote:
| CL-PPCRE is great
| culi wrote:
| mentioned in this thread:
|
| C
|
| * Lua https://www.lua.org/source/
|
| * Redis https://github.com/redis/redis (mentioned twice)
|
| * Ruby https://github.com/ruby/ruby
|
| * SQLite https://sqlite.org/src/dir?ci=trunk
|
| C++
|
| * Botan https://github.com/randombit/botan
|
| * ClickHouse https://github.com/ClickHouse/ClickHouse
|
| Go
|
| * Go's standard library https://cs.opensource.google/go/go
|
| * HashiCorp repos, particular those by Mitchell
| https://github.com/hashicorp
|
| F#
|
| * jet.com repos https://github.com/jet?language=f%23
|
| Haskell
|
| * Elm compiler https://github.com/elm/compiler
|
| Lisp
|
| * CL-PPCRE https://github.com/edicl/cl-ppcre/
|
| * Mezzano USB driver
| https://github.com/froggey/Mezzano/blob/master/drivers/usb/m...
|
| PHP
|
| * Carbon https://github.com/briannesbitt/Carbon
|
| * Laravel https://github.com/laravel/laravel
|
| Python
|
| * pytudes (notebooks) https://github.com/norvig/pytudes
|
| R
|
| * sf (ex of functional OOP) https://github.com/r-spatial/sf
|
| Ruby
|
| * Sequel https://github.com/jeremyevans/sequel/
|
| * Sidekiq https://github.com/sidekiq/sidekiq
|
| Rust
|
| * ripgrep https://github.com/BurntSushi/ripgrep
|
| Scala
|
| * fs2 (ex of good type safety) https://github.com/typelevel/fs2
|
| * monix (ex of ugly code with great performance)
| https://github.com/monix/monix
|
| TypeScript
|
| * GitHub Desktop (ex of SPA) https://github.com/desktop/desktop
|
| ---
|
| thanks to: cejast, bb86754, wewxjfq, antonyt, bit, diego_moita,
| agjmills, freedomben, Contortion, valenterry, DethNinja,
| mberning, seneca
| mberning wrote:
| Ruby - Sidekiq
| mo_42 wrote:
| C++ isn't my favorite programming language anymore.
|
| I guess the Doom 3 source code is an elegant codebase.
| Surprisingly, they used C++ features quite sparsely.
|
| I think that's nice because in programming it's about getting the
| job done and not about using all sorts of features for other
| reasons.
| blt wrote:
| Redis is a popular answer for C, and I agree.
| petercooper wrote:
| I was going to say this too. C is more my "consistently
| appreciated" language than ever my favorite of the moment, but
| the Redis codebase is a fantastic example of it that's very
| easy to digest.
| cejast wrote:
| Go and it's standard library. 'Elegant' is pretty subjective, but
| it's a treasure trove of learning how things work under the hood.
| I've learned loads about networking, compression, encryption and
| more by browsing through it, because the code is super easy to
| read and understand.
| earthling8118 wrote:
| What makes it easy to read and understand though? I am
| seriously having a hard time figuring this out. People tout Go
| for this all the time, but I don't know of a single codebase in
| it that I think fits that description. When I look through them
| they look convoluted and just sort of messed up. Things like
| awkward error handling, dealing with null, capitalization for
| public/private, magic functions, and imports, and much, much
| more all add up and make me abhor the language. I don't think
| it's good or easy to use at all, but people rave about it.
| quaintdev wrote:
| I love Go. I think it depends on what trajectory you followed
| to reach to Go or any other language. For me it was
|
| BASIC -> VB -> Java -> Python for some time -> Go
|
| How you feel about Go is how I feel about JavaScript
| BrandoElFollito wrote:
| I went Pascal, C, Perl, Python, Go
|
| And I like Typescript to some point.
|
| I do not think they languages are mutually exclusive (on
| the like scale). But I am just an amateur hobbyist dev.
| asylteltine wrote:
| [dead]
| asylteltine wrote:
| [dead]
| gravypod wrote:
| (Opinions are my own)
|
| At my employer we use a subset of C++ and we use Go. We have
| a process by which when you write code others have to review
| it and you need to have a review by someone who is an
| "expert" [0] in the language [1]. You become an "expert" by
| being ordained by a shadowy committee who reviews code you
| submit to the code repository. They look for knowledge of the
| core language, how this language is used within the company,
| the external and internal libraries, performance, testing,
| etc. There are many factors and if you demonstrate all of
| them you get marked as being this type of "expert."
|
| Before I joined this company I had written code which was
| launched into production in the following languages: Java,
| PHP, C, C++, assembly (arm + x86), Python, JavaScript
| (browser + node), and a few more. I would consider myself
| about average in all of these. I did not write any golang.
|
| After I joined my current job I obtained this "expert" bit
| for both C++ and Go. It took ~1.5 years to get the C++. It
| took ~3-5 months for Go.
|
| You can actually see the first golang code I wrote (this was
| at home when I was experimenting with the language before
| convincing some team members we should rewrite some of our
| infra in go): https://github.com/gravypod/gitfs
|
| It has all sorts of mistakes but I didn't read any guides. I
| just used https://cs.opensource.google to search for examples
| of things that I thought I would need to do (ex: "how do I do
| a switch statement").
|
| For C++ I had worked on ~2 projects that used it. My first
| few PRs were very rough and I had a lot of performance issues
| that crept into my code. If I didn't already have a lot of C
| experience I would have also had a bunch of pointer/lifetime
| stuff the reviewers would have found (I know this from
| reviewing new team members first lines of C or C++).
|
| I know that to some C++ represents a literal worst case but
| most people coming from C++ to Go will think it's amazing
| because it removes all of the common footguns.
|
| > Things like awkward error handling
|
| Yes, it is very clunky and annoying but it's very simple.
| It's just a normal if statement and doesn't use any special
| language rules. I think this would still be better if there
| was dedicated syntax for it (something like throw/try/catch
| which works the same way but gives it a different syntax) but
| honestly I don't think it's as bad as it's made out to be.
| It's basically a "less bad" errno and that worked go-...
| dece-... ehm fine for many years.
|
| > dealing with null
|
| I've never really had to think about this too much. There are
| some times it is important but I rarely return nullable
| things without errors and it hasn't bitten me yet. My code is
| not provably correct but for the things I'm working on I
| don't need that guarantee. If I did I'd probably switch to
| Rust or something with better type safety.
|
| > capitalization for public/private
|
| Yea, this sucks but it doesn't really get in my way much. I
| don't like it but it isn't actively hurting my usage.
|
| > magic functions
|
| Like `String()`? I don't know if that's the worst think in
| the world. Python, C++, and Java have things like this.
|
| > and imports
|
| It's not been too bad for me. What I think is unfortunate is
| that the package of something is unconnected to where it is
| in most go usages which is annoying but it makes things more
| terse. This does actually hamper my productivity.
|
| > I don't think it's good or easy to use at all, but people
| rave about it.
|
| It's pretty easy to use because all of the libraries I've
| seen share common interfaces for behavior. This makes things
| feel a lot more cohesive. fuse-go and billy was very easy to
| use in gitfs because of this.
|
| [0] - This is not an expert as in "knows everything" but more
| like "has been seen to consistently write efficient, simple
| to understand, idiomatic code." It basically means that when
| someone else from this subset of SWEs reviews your code they
| often do not have many comments. Again, I want to stress,
| this is not expert as in "knows everything" just as in "good
| enough".
|
| [1] - https://abseil.io/resources/swe-
| book/html/ch03.html#what_is_...
| cpach wrote:
| Is there any programming language that is universally seen as
| objectively good?
| blowski wrote:
| No, because the different trade-offs they make all have
| costs and benefits. For example, C's precise memory
| management can give better performance compared to PHP, but
| also requires more expensive programmers to work with it.
| If all you're doing is a simple CRUD system, C's power
| would be counter-productive, so PHP is a "better" language
| in that context.
|
| So a "good" language depends on what you're trying to do
| with it.
| abatilo wrote:
| Speaking for myself, the language itself is simple. There
| aren't a lot of features, which means you do have to write
| more and it's more verbose, but learning the entirety of the
| language's features is very easy to do.
|
| Even with the relative magic of things like init functions
| that execute on import, there's so much less magic that you
| have to consider.
|
| IMO it's the easiest to jump into for this reason. Yes, the
| code itself might be excessive, but reading Go is as simple
| as can be.
| michaelcampbell wrote:
| > People tout Go for this all the time
|
| What gets me about go is 2 things.
|
| Its touted as being so easy that a junior dev can pick it up
| easily; it's targeted towards average developers. Fine, this
| is a virtue; when Java said the same thing, it's a horrifying
| blight.
|
| The other is that people seem to mistake motion for action.
| "The code flies from my fingers" is one way I've heard it
| said. And, sure, you have the same error catching boilerplate
| (which again, in go is a virtue but other languages seems to
| be considered a sin) 1000x, as if the clicky-clicky of the
| keyboard is some measure of productivity.
|
| It's got a big "blub paradox" thing going, to my eyes. I
| don't find it elegant at all, or maybe I mean not very
| expressive.
|
| Taken ad absurdum, I have a language that only adds 1 to a
| variable. I can understand that language in milliseconds. But
| I can't do much with it. Maybe go hits a good balance, I
| dunno, but I found it quite tedious.
| teeray wrote:
| It's the complete lack of magic. What you see in front of you
| is pretty much exactly what happens. You don't have to keep a
| cathedral of language semantic subtleties in your head when
| reading someone else's code.
| rochak wrote:
| Pointer vs value receivers and named returns have so many
| gotchas that it is not even funny. Lack of magic my ass.
| asylteltine wrote:
| [dead]
| kaba0 wrote:
| Then why don't we go back to assembly? There is even less
| magic there, every line is trivial to understand, isn't it?
| SirensOfTitan wrote:
| Anyone have any good clojure examples?
| janetacarr wrote:
| I try not to toot my own horn, but I wrote this little quadtree
| library that tickles that elegance part of my brain. I try very
| hard to write elegant code. I have other Clojure repos, but
| they suck. :P
|
| https://github.com/janetacarr/quadtree-cljc
| lemming wrote:
| Anything by James Reeves aka weavejester
| (https://github.com/weavejester).
| doubleg wrote:
| Metabase's toucan (https://github.com/metabase/toucan) has some
| elegantly annotated source code:
| https://rawgit.com/metabase/toucan/master/docs/uberdoc.html
| rkagerer wrote:
| Open Hardware Monitor (OHM), in C#
| phkahler wrote:
| C++ this file covers all the math for working with NURBS curves
| and surfaces:
|
| https://github.com/solvespace/solvespace/blob/master/src/srf...
|
| There is a lot more in other files - triangulation, booleans,
| creation - but the core math functions are there in very readable
| form.
| nrdvana wrote:
| C++
|
| An old one, but the FTGL library (renders truetype fonts in old-
| school OpenGL in half a dozen different ways: texture-per-letter,
| texture-per-word, 2D polygons, 3D polygons, etc) is the best
| example of C++ inheritance I've ever run across. The code
| formatting isn't my favorite, and comments are sparse, but the
| hierarchy of objects subclassed for all the different rendering
| modes is just about perfect.
| https://sourceforge.net/p/ftgl/code/HEAD/tree/trunk/
|
| Perl
|
| The Mojolicious / Mojo toolkit. Great minimalist API and great
| documentation and clean code all around.
| https://metacpan.org/release/SRI/Mojolicious-9.33/view/lib/M...
| arrjayh wrote:
| I nominate SDL2 and DPDK. Spent a lot of time combing through
| these code bases, found them to be excellent.
| karmakaze wrote:
| What I find to be elegant in a codebase is where the chosen
| abstractions or seams that separate subdomains/concerns is well
| chosen that each is handled mostly in one place without a lot of
| ceremony or machinery. I would call these 'well factored' for
| factors which are domain-specific.
|
| Each language has different ways that may lend itself as part of
| this shaping, but I like being able to think of this as something
| to look for when reading and strive for when writing,
| irrespective of the language at-hand.
| jpe90 wrote:
| I've really enjoyed reading (and playing with) kons-9's codebase
| in Common Lisp. It lets you do exploratory 3D modeling via the
| program's GUI or the repl. The source is very neatly structured
| and readable. I don't see many CL projects that do 3D rendering,
| so it's nice to see!
|
| Quick demo:
|
| https://www.youtube.com/watch?v=i0CwhEDAXB0
|
| Repo:
|
| https://github.com/kaveh808/kons-9
| DethNinja wrote:
| C++ - Botan
|
| C - Redis
| jnordwick wrote:
| arthur whitney's famous first J interpreter.
|
| https://www.jsoftware.com/ioj/iojATW.htm
|
| The first version of KDB the timeseries database was written by
| arthur in C to bootstrap the K interpreter that was used to write
| KDB. It was 26 files, named a.c to z.c, none larger than a single
| page of C written with notepad.exe.
| ttkciar wrote:
| Working with Perl, two things spoiled me for other languages:
| JSON and DBI/DBD.
|
| In Perl, everything serializes to JSON without fuss. It can be
| "lossy"; objects without an explicit JSON serialization method
| and coderefs can't be deserialized, but serializations at least
| have placeholders for them.
|
| Compare to Python's json module, which doesn't try very hard to
| serialize things and throws exceptions every time it runs across
| something new. It's very frustrating to use.
|
| Perl's DBI provides a universal API for all databases, with
| implementation-specific details in an underlying DBD module
| (which both provides glue between the DBI abstraction and
| programmer access to features specific to different database
| systems).
|
| Compare to Python, where you need to import a different module
| and use a different API for every different kind of database. As
| I increasingly use Python for a living, I frequently wish they'd
| follow Perl's example with this.
| mike_hock wrote:
| > In Perl, everything serializes to JSON without fuss. It can
| be "lossy"; objects without an explicit JSON serialization
| method and coderefs can't be deserialized, but serializations
| at least have placeholders for them.
|
| > Compare to Python's json module, which doesn't try very hard
| to serialize things and throws exceptions every time it runs
| across something new. It's very frustrating to use.
|
| Sounds kinda backwards to me. I thought the fact that throwing
| exceptions (or "making a fuss," if you will) is better than
| silently producing incorrect (or "kinda lossy," if you will)
| results wasn't controversial anymore in 2023.
| 2h wrote:
| > universal API for all databases
|
| Go has this too, very handy:
|
| https://godocs.io/database/sql
| freedomben wrote:
| You might really like Ruby! It's part descended from Perl and
| maintains a lot of the nice things about perl such as json, and
| the amazing string functions.
| ttkciar wrote:
| I tried very hard to like Ruby. "On paper" it looks great,
| but I had a lot of trouble getting used to the syntax.
|
| I ended up going deep on the D programming language for my
| "new language". As a statically typed language it's not as
| expressive as the Python/Ruby/Perl contingent, but it's a lot
| more expressive than most static languages, and its C-like
| syntax "clicked" with me in a way Ruby never did.
|
| It also can approach C-like run-time performance and memory
| footprint at times, which I appreciate. As much as I like
| developing in Python and Perl, I frequently wish they had
| better run-time performance and a smaller memory footprint. D
| gives me that, at the cost of a little expressiveness.
| 7thaccount wrote:
| Funny enough, but I've come across some really nice Perl code
| in the wild at work. I was used to the vendor providing some 40
| class Java monstrosity to do something that should take like a
| page of code, so I was pleasantly pleased to find a contractor
| who provides an extremely well commented page of code to do
| something simple, yet critical to operations. The way Perl
| calls the OS to do something and glue everything together was
| pretty elegant.
| knightcrusader wrote:
| The only thing about the JSON package though, when things go
| wrong, it is very unhelpful about where it goes wrong.
|
| I usually end up always wrapping the json_decode in an eval to
| catch the error and handle it in an easier to understand
| fashion.
|
| But I agree though, its nice how json and perl data objects
| pretty much map to each other. It's great.
| dragonwriter wrote:
| > Compare to Python, where you need to import a different
| module and use a different API for every different kind of
| database.
|
| You... don't. Python has a unified DB api (DBAPI 2.0) which
| drivers usually support. They often _also_ provide a lower-
| level API specific to the DB.
| culi wrote:
| Ruby, being a Perl-inspired language, has `.to_json` built in.
| You can do
|
| ```rb # hashes { foo: 'bar' }.to_json
| # numbers 28.to_json # anything really
| ['hello', 42, { lorem: "ipsum" }].to_json
|
| ```
| viralpraxis wrote:
| That's simply not true. This method is monkeypatched by json
| gem
| quesera wrote:
| JSON was added to Ruby stdlib in ruby-2.0.0 (2013), and has
| been a default gem since ruby-2.3.0 (2015).
|
| This is pretty close to "built in", I think.
| michaelcampbell wrote:
| You're both right, I think.
| xkcd-sucks wrote:
| Omg the python stdlib json / simplejson both refuse to support
| custom serializers for keys only, as an explicit design
| decision. It is justified as "JSON keys must be strings", but
| JSON values can only be string/float/book/null so it seems a
| bit arbitrary. Leads to annoying gymnastics if you want to
| enforce "strong typing" of keys with Enum/pydantic/etc.
| [deleted]
___________________________________________________________________
(page generated 2023-06-17 23:01 UTC)