1. 11

    It’s curious how of the successful Haskell projects in the wild, few if any go crazy with the type system.

    (This observation is based primarily on PostgREST and Pandoc, and now ShellCheck. GHC might be a counter-example.)

    1. 3

      It’s curious how of the successful Haskell projects in the wild, few if any go crazy with the type system.

      Considering how popular e.g. lens, servant, and aeson are, I’m not sure this follows. What is your criteria for being a “successful Haskell project in the wild?” What’s your definition of “go crazy with the type system?”

      1. 6

        Those are librairies though. PostgREST, Pandoc and ShellCheck are not meant to be used only by Haskell developers.

        1. 0

          So, let’s say “user-facing apps” then. Now what was meant by “go crazy with the type system” I wonder?

        2. 4

          In what sense does Aeson go crazy with the type system?

      1. 65

        So, I love Rust, and all of the nice things they say about Rust are true. Having said that, I’m now going to completely ignore the Rust angle and focus on something else that occurred to me.

        To summarize Discord’s problem - after extensively optimizing a Go service to produce minimal garbage, they found that the garbage collector was still triggering every two minutes (which appears to be a hard minimum frequency) regardless of the lack of garbage produced. Further, each GC sweep was expensive because it had to walk the entire heap full of live objects.

        The interesting point to me is that this use case (latency-sensitive service with extremely low rates of garbage production) was pathological for a tracing GC, and that optimizing it to produce less garbage made it even more so. Tracing collectors operate on every live object and ignore dead objects, so a heap full of live objects and very few dead ones is a bad fit for a tracing collector. They solved their problem by switching to a reference counting system (well, “reference counting” where everything has exactly one owner and so you don’t actually need to count). Reference counting ignores live objects and operates on dead ones, so of course it would be a better fit for this service. If Go had a collector based on reference counting they probably could have gotten much of the same benefit without rewriting.

        This reminded me of “A Unified Theory of Garbage Collection” by Bacon et. al, but it hadn’t occurred to me before how optimizing the app to produce less garbage could make the GC’s job harder in some ways. It’s still better to reduce garbage production than to not do so, but it may not give as much benefit as one might expect because of this.

        1. 3

          They solved their problem by switching to a reference counting system (well, “reference counting” where everything has exactly one owner and so you don’t actually need to count). Reference counting ignores live objects and operates on dead ones, so of course it would be a better fit for this service.

          Aside from your wider point, it’s a little more subtle than that, because of abstractions like Rc which give a counted reference to a value, meaning multiple references. There’s also Arc which is an atomic reference counter for use in multiple threads. The first simple Rust program I wrote, I was guided to using Rc, so it’s not even uncommon. Without seeing their code, I’m willing to bet there are plenty of such cases in their code.

          1. 6

            The first simple Rust program I wrote, I was guided to using Rc, so it’s not even uncommon.

            Do you mind sharing what you were trying to do? I’ve been writing Rust for a long time now, and I can count on one hand the number of times I’ve needed Rc. I’ve used Arc a fair number of times though. Still, I’d probably call both pretty uncommon. But there are certainly types of programs where they may be more common.

            1. 4

              I’m currently making a game engine in Rust (rewriting my old Idris stuff) and I use it all the time, from day one. Some of it may be due to the problem at hand necessitating it, but some of it is surely my lack of experience in Rust. I think some of the problems might be solved with a more refined use of lifetimes… but I’ve been burned by structs+lifetimes before so I’d rather opt for something I have a better grasp of even if it’s more inelegant a solution.

              For example, my game has a Timeline object, which is basically the central source of truth about important game data (stuff that has to be saved). But it’s not a regular field, it’s an Rc, because I need to share it with Scene objects (which actually run the game logic). I could make a complex messaging system to telegraph the state changes between Server and multiple Scenes but again… I don’t really wanna.

              1. 2

                Yeah I’ve never made a game engine, so it’s hard for me to know whether Rc is truly beneficial there. In any case, I’m mostly just trying to push back against the notion that reference counting is common in Rust code. (And specifically, Rc.) I was just very curious about the “first simple Rust program” that someone wrote where they were guided towards using Rc.

                This is important because if reference counting were very common, then that would diminish the usefulness of the borrow checker. e.g., “What good is the borrow checker if you wind up needing to use reference counting so much?” Well, you don’t wind up needing to use reference counting a lot. There are of course many cases where reference counting is very useful, but that doesn’t mean it’s common among the entire body of Rust code.

              2. 1

                Just as an off-hand example from my experience: you basically can’t get anything done with GTK and Rust without Rc. Cf. https://github.com/bitemyapp/boxcar-willie/blob/master/src/main.rs#L108

                I wrote boxcar-willie with assistance from the gtk-rs people.

                Some common web-app stuff will force you into that too.

                There are other situations and libraries that force it but these are the ones that come to mind from my own background. GUI apps and web apps already touches >80% of programmers.

                1. 2

                  What part of web apps use Rc in Rust? There is more nuance to this. A better metric might be “of all the types you define in your project, what proportion of them use reference counting?” If you have to have one reference counted type among dozens of other non-reference counting types, then I’d say it’s pretty uncommon. For example, if most web apps have a database handle and then database handle uses an Arc to be efficiently shared between multiple threads simultaneously, and since database handles are pretty common in web apps, would you then conclude that “reference counting is common” in Rust? I don’t think I would. Because it’s doesn’t pervade and infect everything else in your code. There’s still going to be a lot of other stuff that doesn’t use reference counting at all.

                  The GTK case is indeed known, and was on my mind when writing the above comments. But it’s not clear to me that this is a GTK problem or whether it generalizes to “GUI apps.”

                  1. 1

                    Well usually it’d be an Arc, particularly in cases where the framework doesn’t provide a way to share data between request handlers.

                    I was just proffering where I’d run into it. I’m not trying to make some kind of polemical point. I rather like using Rust.

                    then database handle uses an Arc to be efficiently shared between multiple threads simultaneously, and since database handles are pretty common in web apps, would you then conclude that “reference counting is common” in Rust?

                    I’m speaking to peoples’ subjective experience of it and how they’re going to react to your characterization of it being rare. We’re not taking a pointer head-count here. You get someone comfortable with but new to Rust and have them spin up a few typical projects they’re going to say, “but I kept running into situations where I needed ${X}” and it doesn’t feel rare because it occurred at least a couple times per project. I’m personally very comfortable and happy with the performance implications of a handful of reference-counted pointers and everything else being automatically allocated/de-allocated on the stack or heap. That being said, if you use the wording like you used above, you’re going to continue to elicit this reaction if you don’t qualify the statement.

                    Edited follow-up thought: I think part of what’s needed here perhaps is an education push about Rc/Arc, their frequency in Rust programs, when and why it’s okay, and how it isn’t going to ruin the performance of your program if a few are floating around.

                    1. 2

                      My initial reaction was to the use of Rc. If they had said Arc, I probably would not have responded at all.

                      1. 1

                        I apologize for communicating and interpreting imprecisely. I mentally glob them together.

                        I think GTK is in fact the only time I’ve really used Rc. Everything else has been Arc I’m pretty sure!

            2. 1

              The interesting point to me is that this use case (latency-sensitive service with extremely low rates of garbage production) was pathological for a tracing GC, and that optimizing it to produce less garbage made it even more so. Tracing collectors operate on every live object and ignore dead objects, so a heap full of live objects and very few dead ones is a bad fit for a tracing collector.

              I wouldn’t draw a general conclusion from the behavior of the Go garbage collector.

              Optimizing a system to produce less garbage is a standard optimization technique for the JVM and .NET.
              It is effective on these platforms because they both use generational garbage collectors.
              Long-lived or large objects are traced rarely or not at all.
              The LMAX Disruptor, for example, allocates all memory at startup.

              This technique isn’t effective for Go because the Go garbage collector forces a collection every 2 minutes.

              Go uses a conservative non-generational GC.
              Here are some of the tradeoffs of this design:

              • Conservative - objects are never moved in memory and the heap is not compacted.
                Interoperability with C is easier but heap fragmentation is a potential risk.
                Memory usage is lower than with a generational GC.
              • Non-generational - Generational garbage collectors can scan only recently allocated objects while ignoring old large objects. Most objects die young so this is often beneficial.
              • Pause times may be lower than a generational GC.
              • Lower implementation complexity.

              Neither design is right or wrong but I would be leery of using Go for a high performance system.

            1. 27

              Was anyone else surprised Bram works on Google Calendar?

              1. 15

                I’ve been using Vim for almost 20 years and had absolutely no idea (1) what Bram looked like or (2) that he worked for Google.

                1. 3

                  Definitely.

                  Though I shouldn’t be, it seems like they hired a ton of the previous generation of OSS devs: thinking of things like vim, afl (uncertain, though the repo is under Google’s name now), kismet, etc.

                  1. 2

                    It’s just not what I would’ve guessed would be the highest and best use of his talents.

                    I’m not saying I believed he was working on vim, I know better than that. I’m just surprised it was something so…ordinary and corporate.

                  2. 3

                    Yes! And that he sounds as if Google is still a start-up and not one of the biggest companies in the world. Had to check the date of the article. Of course it doesn’t feel like a startup, Bram…

                    1. 2

                      Maybe he means Google Zurich, which seems to have expanded by a lot lately?

                    2. 2

                      Me, honestly.

                    1. 6

                      The post author does not mention it, but there is also Haskell Programming From First Principles which she co-authored along with Chris Allen. Many beginner learners say good things about the book. Some, like me, who appreciate concise writing found it lacking. In the end, whatever book you use - you won’t make much inroads into Haskell (or any radically new tech for that matter) without actually trying to develop projects in it. That’s how we learn. Hands-on work.

                      There is also Real World Haskell. Although it is a bit outdated (but being revived by volunteers), it contains great practical recipes.

                      1. 9

                        Totally agree with your point about actually getting your hands dirty. Haskell is no different from any other language in that regard. You’ll get nowhere simply flirting with the language and pondering poor monad analogies.

                        The post author does not mention it

                        I think there’s a reason for that, though I hope this thread doesn’t descend into an argument about that bit of history.

                        1. 3

                          Huh, did the two coauthors of that book have a falling out after it was published? I read it myself and liked it well enough, although I found it aimed at a level of Haskell understanding a little more basic than my own at the time I read it.

                          1. 5

                            Yes, though as I said I hope this thread doesn’t turn into all of us discussing it. There are statements from the authors and other discussions elsewhere, but let’s all leave it at that.

                            Instead, we can talk about Julie’s subsequent work.


                            I bought an early access copy of Finding Failure (and Success) in Haskell and I thought it was really good, especially for people new to the language. The exercises are practical, and help you understand the why behind the what. Motivating examples are so important. Otherwise, I think most people who see a tutorial like “Here’s how monad transformers work” would be like “Ok? But so what?”

                            1. 2

                              Chris Allen (the other co-author) has branched off on his own as well, looking to publish the “next in series” book titled Haskell Almanac. Sadly, however, there has been no update on this book, just as there is none on the much anticipated Intermediate Haskell. Though luckily there is Thinking in Types by the author of polysemy.

                              As I see it, Haskell lacks intermediate level books more than beginners books.

                              1. 2

                                The final release of Haskell Programming from First Principles now has the OK. I’m releasing it by the end of this month. I’ll work on the print version after that. I have a printer that can do an offset print run ready to go. Just a matter of figuring out how many I should run and how to finance it. I have a climate controlled storage unit ready for the books. I never found a suitable solution for third party logistics so my wife and I will be shipping all the print books.

                                As I see it, Haskell lacks intermediate level books more than beginners books.

                                You’re right that this is the more immediate problem now. Over 5 years ago when I started on HPFFP making sure no beginner was left behind was the more pressing issue.

                                I have work to do on https://lorepub.com before it’s ready to sell print books (~1-3 days of coding and ops work from seeing the deployment for digital sales). Once the HPFFP print version is available for sale and that situation is stable, I’ll get back to the Almanac. After the Almanac, I’ll be seeing if I can be more productively employed as a publisher than an author. I believe the process we hammered out for HPFFP can be well applied to other topics and educational goals.

                        2. 4

                          Speaking of getting your hands dirty… There is the https://github.com/qfpl/applied-fp-course/ where you actually build a small REST backend with Haskell. Sort of a fill in the blanks style, independent levels of increasing complexity thing. :)

                          Disclaimer: I’m biased, I wrote it.

                        1. 9

                          It depends on what you mean by “their copy of git”. As far as I’m aware, this comes in at least 2 different forms, possibly more.

                          The backend component of the website, written in rails, most likely uses bindings for libgit2 (especially because GitHub maintains libgit2), probably rugged. Their development of libgit2 and rugged is fairly out in the open. The SSH service may use the actual git binary (or rather git-receive-pack/git-upload-pack).

                          When I worked at Bitbucket, we used pygit2 and a small patch applied to git itself which improved NFS performance. There were a number of interesting edge cases which were tested for performance and accuracy which determined whether we’d call out to the binary with a very specific command or use pygit2, though all of that was hidden behind a wrapper library which abstracted out hg and git.

                          It is theoretically possible to implement git-receive-pack and git-upload-pack in code rather that calling the binaries, but unless there’s a custom storage backend, this probably isn’t worth it.

                          EDIT: the git/libgit2 patches from Bitbucket I’m aware of are listed below.

                          1. 2

                            unless there’s a custom storage backend

                            I would be surprised if there wasn’t in GitHub’s case. Is there anything public about that?

                            1. 6

                              Not directly, but they talk about how they handle replication with distributed operations at https://github.blog/2016-09-07-building-resilience-in-spokes/. I can’t seem to find anything on routing or how they handle repo accesses though.

                              There’s also some pretty low level stuff in https://github.blog/2015-09-22-counting-objects/ where they talk about what they did to optimize git clones for very large repos. They also mention “alternates” in passing which can be very powerful (we used these at Bitbucket for diffs - we generated the diff in a different working directory using alternates, but that’s because they use a very unique diffing algorithm).

                              As far as I can tell, GitHub tends to do a pretty good job of upstreaming any changes they make… and these blog post seems to imply that they’re using raw git under the hood for most operations, which makes sense. If you can use the canonical implementation of something, you probably should… especially if it’s the technology on which your whole product is built.

                              1. 7

                                Thanks! I found it after reading your comment:

                                I had a hard time believing they weren’t using a dfs or a specialized storage layer because I’ve worked on storage-at-scale problems before and you run into needing something fancy pretty quickly.

                            2. 1

                              NFS? Really?

                              1. 1

                                Yep, it was a Netapp storage cluster which exported NFS volumes.

                                1. 3

                                  I still have flashbacks to that exact setup. Of course this was at Apple so we were eating our own dogfood and using OS X as a client. It was very bad. I used to regularly find bugs in the NFS stack by searching our video sources for 1k runs of 0.

                            1. 0

                              I knew my time would come! http://www.monohaskell.com/

                              1. 53

                                *writes a rant about how developers are petulant little children who care more about “convenience” and “fun” than “performance”*

                                *puts it on medium*

                                1. 19

                                  I really hate this kind of response. It’s super-trolly and contributes nothing except making you feel good about yourself for somehow finding the “loophole” that allows you to ignore the valid objections raised in the article.

                                  We don’t all have to be perfect paragons of virtue at all times in order to be allowed to complain.

                                  1. 15

                                    They’re blaming all performance problems on moral failings. These people are too whiny and self-entitled to care about the customers, so they use convenience trash like WEBPACK and BOOTSTRAP. Their language oozes contempt.

                                    In that context, “you used a bloated website for personal convenience” shows how little they actually thought this through.

                                    1. 5

                                      No, it doesn’t. It shows the fact that they didn’t have the time to put up their own blog website and maintain the code for it, which is a PITA. Do you think that the author works for Medium and personally contributes code for their website? All of the people that already agree with the sentiment that “bloat is bad” are going to hoot at your epic comment and meanwhile the average person will look at it and be confused about why you’re such a dick about people not having the resources to maintain their own blog.

                                      1. 21

                                        He’s saying that people who trade performance for convenience are bad developers, and then he trades performance for convenience by using Medium. I don’t see anything wrong with trading performance for convenience. I see something wrong with him being an asshole to people who trade performance for convenience and then doing it himself.

                                        If he doesn’t know how to post his stuff anywhere but Medium, then he probably doesn’t know enough about web development to make sweeping critiques about web developers.

                                        1. 6

                                          He or she knows stuff is bloated. He or she posting on Medium does not invalidate his or her knowledge of bloat.

                                          She or he is not an asshole merely for pointing out that bloat is a problem and we’re all complicit.

                                          1. 12

                                            He’s not an asshole for pointing out bloat. He’s an asshole because he lays all blame for bloat squarely on the feet of people who use frameworks, calls them “McDonald’s line order cooks”, and claims anybody using a convenience is doing silicon valley cosplay.

                                          2. 6

                                            For basically every developer alive, blogging is not a job, and nobody is spending 40 hours a week doing it. What a ridiculous false equivalence. Some people have families and lives outside of work they must dedicate time to instead of idealistic puritanism, and can yet somehow still criticize the work they see happen on the job. Strange concept, isn’t it?

                                            1. 4

                                              That’s a lot of snark when it’s not at all obvious why work-vs-hobby is a critical distinction for determining whether or not something is eligible for criticism. In particular, software businesses (like hobbyists) also have finite resources (notably developer time) and must make decisions about how to spend those resources. Contrary to the false dichotomy put forth by TFA, these businesses’ interests are generally aligned with their users such that choosing to spend developer time on new/improved features is often a better value for the user than performance. I’m a performance hawk, but even I don’t pretend that performance is the only valuable feature–that’s patently absurd. It turns out everything is tradeoffs, and the people ranting about web performance without acknowledging the tradeoffs aren’t worth listening to.

                                              1. 0

                                                Did you respond to the wrong comment?

                                                1. 1

                                                  Nope. And I’m not sure what about my comment makes you suspect I was responding to the wrong comment.

                                                  1. 0

                                                    I didn’t say anything about businesses having “infinite resources” so I was confused when you suddenly changed topic completely

                                                    1. 0

                                                      Not changing the topic; just giving you the benefit of the doubt. I was responding to the most charitable interpretation of your ambiguous comment, because while the most charitable interpretations was still clearly wrong, it is more understandable and less nonsensical than other interpretations. Feel free to clarify your position.

                                                      1. 0

                                                        So what you’re saying is that you grafted nonsense onto my statement because people using their time away from work for anything other than being productive is nonsensical to you? I don’t see why I should clarify my position when you’re obviously just being a troll.

                                        2. 1

                                          webpack implements tree shaking. It is not a trash.

                                        3. 3

                                          Hate it or not, but it neatly reflects the problem. Easy trumps performant.

                                          1. 2

                                            I disagree that this is a trolly response. It’s sarcastic and brief to be sure, but it certainly accomplishes something. It points out that the author of this article is a hypocrite, and even if hypocrisy isn’t the same thing as being wrong, it’s good to know that someone is being hypocritical when evaluating how to treat people who are wrong in the way described.

                                            1. 1

                                              You can make everyone a hypocrite if you try.

                                              https://thenib.com/mister-gotcha

                                              https://thenib.com/mister-gotcha-vs-the-green-new-deal

                                              It’s a cheap and pointless tactic of Status Quo Warriors. Nothing can be changed because we’re all hypocrites for living with things as they are now.

                                          2. 12

                                            *writes a rant about how developers are petulant little children who care more about “convenience” and “fun” than “performance”*

                                            *puts it on medium*

                                            This is quite a dismissal (appeal to ridicule?). Are people who post on medium not allowed to complain about web performance, simply because they post on medium?

                                            1. 15

                                              They can both be right and be hypocritical, pointing out the hypocrisy isn’t wrong just because they’re right.

                                              If /u/hwayne said, “You’re contributing to the problem you claim exists by putting your article on medium, therefore your argument is wrong”, they’d be committing a logical fallacy. They’re not saying that though; they’re agreeing with the author about what the issue is, and pointing out that the author is needlessly contributing to it.

                                              1. 9

                                                I don’t actually agree with the author, because they didn’t do anything to support their claim. They just said “it’s devs’ faults for using frameworks” and left it at that. This comment has a different explanation:

                                                While frameworks add overhead, they are hardly ever the main source of bloat. In my experience, there is always lower hanging fruit than initial page size:

                                                • Analytics and trackers
                                                • Ads
                                                • Huge third party SDKs (e.g. social login or videos with ads/DRM)
                                                • Large images
                                                • Fonts

                                                Only the last two have to do with developers. The others are, unfortunately, the current business model of the web. )

                                                1. 4

                                                  If developers didn’t make the decision to use the frameworks and libraries they use, then who did? Spooky ghosts?

                                                  1. 7
                                                    1. Are frameworks and libraries the primary cause of web slowness, or is it something else? How much does using frameworks and libraries contribute to slowness versus having tons of trackers and ads?
                                                    2. How much faster would the website be if they replicated all of the functionality without frameworks and libraries? Is it enough to overcome the extra development time?
                                                    3. Do devs use frameworks and libraries purely because of convenience, or are there other business constraints? Time to market? Responsiveness? Portability?
                                                    4. Can the developers significantly improve performance without getting rid of the framework or library? Is the problem “they use a framework”, or “they haven’t had time to optimize their code, period”?
                                                    1. 2
                                                      1. Counter-question: have you ever in your life been employed to write client-side Javascript and the requirements didn’t list experience in one of JQuery, React, or Angular?
                                                      2. Given that the greatest bottleneck for webpages is bandwidth and that tree shaking can only do so much, significantly faster if you’re on even somewhat poor internet (most of the US is) or a slow, congested device (a lot of the world is).
                                                      3. This is a red herring because you’re assuming that because there are a multitude of justifications for development decisions that the developers making those decisions have no agency, which is absurd.
                                                      4. Tree shaking has been mentioned many times on the page, but the moment a developer uses a scroll-based effect JQuery plugin or starts requiring DOM to be rendered through complex javascript, they are not only doing so because the architecture of the framework has inspired them to do so, but because the design of those libraries tell developers they don’t have to understand what the framework is doing. The problem is multitudinous, just like the justifications that you think relieve the developers of their agency in their decisions.
                                                      1. 3

                                                        Counter-question: have you ever in your life been employed to write client-side Javascript and the requirements didn’t list experience in one of JQuery, React, or Angular?

                                                        Not the person you were asking, but yes, I have. Back when we called this stuff “DHTML”, and lamented that too many people copy/pasted snippets of JavaScript without understanding what they did.

                                                        because the design of those libraries tell developers they don’t have to understand what the framework is doing

                                                        There is no “bare metal” anymore. There is nobody who genuinely understands the entire stack anymore, and probably only a handful of people who even understand any single layer of it.

                                                        Once, nearly two decades ago, I used to think I did, but even then it turned out I really didn’t. Everything from the JS library/framework to the language runtime to the browser itself to the operating system to the CPU it’s running on is full of too much deep magic for any one person to understand even with a lifetime to study it all. We are at the “if you want to make a pie from scratch, first you have to create the universe” stage.

                                                        1. 1

                                                          I mean, I wouldn’t equate the need for web developers to at the very least know the actual Javascript DOM API’s to a fancy for trying to understand “the entire stack” down to bare metal.

                                              2. 11

                                                I’m not dismissing them because they posted on medium! I’m not dismissing them because they complained about web performance on medium. I’m dismissing them because they say web devs are “an army of McDonalds line order cooks who fancy themselves as Michelin star chefs” on medium. If you’re going to be that contemptuous of web devs, you should at least show an iota of self-awareness about where you’re posting.

                                                1. 12

                                                  1.2 MB transferred, 16.84s. That’s with an adblocker.

                                                  No, they are not allowed to complain. A blog post this length easily fits in 200kb, with the worst CSS framework imaginable included, 10kb would probabaly be possible.

                                                  1. 12

                                                    They can complain all they like. I agree completely that Medium is a technologically subpar and gluttonous medium, but there are clearly non-technical reasons to use it, which (as evidenced) many people feel outweigh its shortcomings.

                                                  2. 4

                                                    I think it’s a form of whataboutism. Everyone lives in a glass house, so everyone should shut up and stop complaining, I guess.

                                                    It’s a really cheap put-down, and I’m with you that it’s a ridiculous dismissal.

                                                    1. 1

                                                      There are many that do not like medium. To read content posted on medium I use a proxy that will leave only the content. Application is a of 10 minutes effort and the result is good enough - https://github.com/husio/readium

                                                      Deploy your own instance or use https://readium-demo.herokuapp.com/@CM30/putting-devs-before-users-how-frameworks-destroyed-web-performance-6b2c2a506aab

                                                      1. 2

                                                        I think you’re correct to notice the mismatch in the medium and the message, but perhaps the channel was chosen specifically because the folks who may benefit most from the advice would read it on Medium instead of elsewhere.

                                                        1. 6

                                                          If they were choosing Medium specifically for that reason, they should have used Medium as an example. There was an essay a while back that did that: it said “you have to read this on Medium” and timed the complaints about medium’s UX to the exact points those UX problems manifested. Anybody else know what I’m talking about? I’m having trouble tracking it down.

                                                          1. 2

                                                            That sounds like a slick way of making a point!

                                                            1. 2

                                                              Found it! https://lobste.rs/s/bn30zs/medium_is_poor_choice_for_blogging#c_udeux9

                                                              Turns out we both commented on it, haha

                                                      1. 0

                                                        If you were to get rid of prism.js and use static highlighting, how would you go about it?

                                                        1. 3

                                                          My personal static website generator uses gomarkdown and I just modified the renderer to pass through to chroma, which ends up looking like this. Obviously you could also use the original python pygments project this too, which is what I used to do when doing “staged” shell based rendering.

                                                          1. 2

                                                            I was also looking at https://www.gnu.org/software/src-highlite/ and considering building one myself in C (pretty sure I will at some point), but for web sites, I prefer to keep it on the client side in order to keep a clean HTML file.

                                                            1. 2

                                                              That highlighting where package is colored as a keyword but function isn’t hurts to look at. ;) Since they list Ada in supported languages, it clearly warrants a pull request. Maybe I should make one.

                                                              1. 1

                                                                I actually attempt to auto-detect the language using Chroma in an effort to backport some colors into my older posts (like the one linked), it detected incorrectly. I gave it a hint and now it should look better, thanks for pointing it out.

                                                            2. 2

                                                              Can you recommend me a good static highlighter? I think prism.js fits well for progressive ehancement,it doesn’t mess up the mark up for presentation.

                                                              1. 3

                                                                highlight is nice. I’m mostly asking about the workflow, what it would look like in the page source.

                                                                Ever since I’ve joined IASSGA[1] I’ve been thinking about generator workflows and their implications quite a lot. In soupault 1.7 we’ve added a function for piping element content through an external process, that was meant to enable using any syntax highlighter. Then I realized that you could also use it for adding a rendered version of that content alongside the source, instead of replacing the content.

                                                                [1] International Association of Static Site Generator Authors

                                                                1. 1

                                                                  I’m mostly asking about the workflow, what it would look like in the page source.

                                                                  I wouldn’t, haha, but probably an HEREDOC:

                                                                  <h1>Highlight example</h1>
                                                                  
                                                                  <pre>
                                                                  <code class=js>
                                                                  #!
                                                                  hl << EOF
                                                                  function foo() {
                                                                          var a = 1
                                                                          console.log('foo')
                                                                  }
                                                                  EOF
                                                                  #!
                                                                  </code>
                                                                  </pre>
                                                                  
                                                                2. 1

                                                                  Chroma is nice

                                                                    1. 1

                                                                      I really like microlight.js and it’s simple enough to port it to other programming languages (and use it for static highlighting).

                                                                  1. 6
                                                                    • Reviewing final release of https://haskellbook.com/
                                                                    • Prepping Boutique for the release ( e-commerce app backing https://lorepub.com/ )
                                                                    • Haircut and errands on Saturday
                                                                    • Picking up sister-in-law on Sunday
                                                                    • Spending week of Christmas w/ in-laws
                                                                    1. 2

                                                                      Awesome! Congrats on going “Final”!!!

                                                                      1. 1

                                                                        Thank you!

                                                                    1. 2

                                                                      I’ve actually wanted this for a long time. Gonna check it out, see what parts are open source.

                                                                      1. 1

                                                                        Can I use this for my public and open source repositories? The URL goes to a place that only seems to let me look ReactJS and popular jQuery plugins.

                                                                        1. 1

                                                                          You bet – aiding the maintainers is at the top of our objectives list. The best way to go about it is to log in via Github and then visit the page to request a new Open Repo import: https://www.gitclear.com/open_repo_requests/new

                                                                          1. 2

                                                                            Sorry, permissions are too broad, I’m not giving you access to my private repositories. You don’t need that to run a report on a public repository.

                                                                            1. 1

                                                                              This always bothers me.

                                                                              I’ve ended up moving all my private repos into organisations so just so I can grant access to my public ones.

                                                                        1. 4

                                                                          Does it count as ‘boring Haskell’ if it starts by enabling 39 language extensions?

                                                                          1. 3

                                                                            Did you look at the list? It’s almost entirely syntax sugar extensions.

                                                                            1. 1

                                                                              GADTs, existential quantification, multiparameter typeclasses, polykinds, rankntypes, scopedtypevariables, type families and datakinds are hardly syntactic sugar.

                                                                              I think enabling stuff like ViewPatterns is fine. That is syntactic sugar. RankNTypes is not.

                                                                            2. 1

                                                                              They start with 39 extensions in their proposed standard library, by my hand count.

                                                                              “Boring” seems like a carefully-chosen word to distract from the obvious commercialization being attempted by the author.

                                                                              1. 4

                                                                                Distract? We’re trying to get paid to move more companies into using Haskell. That’s my (I’m Chris) job and the whole thesis of the article is that there is a highly productive subset of Haskell that is extremely useful in software projects operating under commercial constraints.

                                                                                The first line is:

                                                                                Goal: how to get Haskell into your organization, and how to make your organization more productive and profitable with better engineering.

                                                                                Your reply isn’t constructive and casts aspersions by claiming the explicit point of article is somehow an act of subterfuge. We just want people to start using better tools. For us programmers at FP Complete the reasons for that are selfish but straight-forward: we’re programmers who want to use the tools we like because they make our work less tedious.

                                                                                I want to get paid to write software in nice programming languages. I want to create more jobs where people get to get paid to write code using nice programming languages.

                                                                                1. 1

                                                                                  The ‘highly productive subset of Haskell that is extremely useful in software projects operating under commercial constraints’ does not involve starting with 39 language extensions and a huge pile of extremely complex type system nonsense that results in awful error messages. If people want to use a language with cryptic type errors and high performance they should use C++.

                                                                                  Haskell’s highly productive subset is Haskell with at most about 3 language extensions, all of which are totally optional, along with a set of well-built libraries. I’d avoid typeclasses entirely, and even if you don’t go that far, certainly I’d avoid GADTs, lenses of any kind, and anything to do with the word ‘monad’. No MTL or anything of that nature.

                                                                                2. 3

                                                                                  I’m confused, is commercialization a good thing here or a bad thing?

                                                                                  1. 1

                                                                                    39 extensions in their proposed standard library

                                                                                    That’s what I meant, whoops.

                                                                                    1. 3

                                                                                      A lot of language extensions are innocuous and useful. It’s not our fault those extensions haven’t been folded into the main language. What’s your point?

                                                                                      1. 1

                                                                                        The extensions haven’t been folded into the main language because they’re completely unnecessary. You do not need GADTs to write Haskell. Advanced type system trickery is exactly the sort of unnecessary crap that a ‘Boring Haskell’ movement should be not using.

                                                                                        1. 1

                                                                                          Many of those extensions are actually less well-thought-out than Haskellers think.

                                                                                          It is widely acknowledged that, as a general rule, orphan instances are bad. One problem with them is that they allow third-party modules to introduce distinctions between types that were originally meant to be treated as isomorphic. (At least assuming you are a well-meaning Haskeller. If you wanted to allow third parties to subvert the meaning of your code, you would use Lisp or Smalltalk, not Haskell.)

                                                                                          Then GADTs and type families are dangerous for exactly the same reason.

                                                                                  1. 9

                                                                                    Now, I’m not a Real Engineer, merely one of these computer-wrangling pretenders, but I am actually familiar with those things.

                                                                                    I’ve now interviewed 16 people who started in trad engineering and moved over to software, and they unanimously agree that software is Real Engineering.

                                                                                    1. 7

                                                                                      I’m looking forward to the follow-up study where you interview people who crossed over in the other direction. And maybe some statistical rigor, if you want us to draw conclusions from your empirical research.

                                                                                      1. 2

                                                                                        I’ve so far talked to two people who crossed the other way, but they’re a lot harder to find :(

                                                                                      2. 3

                                                                                        From my perspective[1], I would agree that yes, the field certainly can be done as Real Engineering, but in prevailing widespread practice it’s far more often not.

                                                                                        [1] I say this as someone with an undergraduate degree in engineering, but of the computer variety, so maybe only partway there.

                                                                                        1. 2

                                                                                          The challenge is there but as an industry we’re immature and generally bad at our jobs. That’s what people mean when they say this isn’t real engineering–because nobody’s doing the work. It’s slapdash.

                                                                                          1. 0

                                                                                            This doesn’t bear out with the first-hand experience of crossovers. “Real engineering” is also incredibly slapdash; I have heard too many horror stories from people in fields we idolize as “real”. And while we’re “immature”, there’s also a lot of innovations we’ve made in process that “real engineers” wish they did in their old jobs. Version control is the big one I hear again and again.

                                                                                            There’s a lot we can do better, yes, but there’s also a lot we could be doing much, much worse.

                                                                                        1. 2

                                                                                          My dev environment is version controlled: https://github.com/bitemyapp/dotfiles

                                                                                          1. 1

                                                                                            Must be a different notion of what a fixture is than I’m accustomed to.

                                                                                            Most of my tests are unit tests, property tests, or integration/functional tests. A lot of my tests will run DAL code or poke at the API and see what state the database is in. As a result, when I talk about fixtures I mean the data installed into the database post-table-truncation. Usually in Haskell I’ll also have a datatype storing all the data from the database in memory as a big Fixtures record, a pattern I picked up from a past employer.

                                                                                            1. 5

                                                                                              I damaged the recoil spring guide rod in my competition pistol by installing it upside down. Rookie mistake! It now has a crack on one side but still works. Will have to see if I can machine one: only have a lathe and this isn’t quite a rotational only shape. Otherwise could try and silver braze the crack.

                                                                                              We’re also eyeing a 2nd vehicle, BMW i3, so a test drive maybe.

                                                                                              1. 2

                                                                                                I’m guessing (and hoping) that a failure of the recoil spring guide isn’t going to be dangerous to the shooter?

                                                                                                1. 1

                                                                                                  Nope, and the crack is not on the side that’s subjected to mechanical stress: wouldn’t ever crack there if it was inserted properly.

                                                                                                2. 1

                                                                                                  What’s your comp pistol?

                                                                                                  1. 1

                                                                                                    Browning Hi-Power GP Competition, the one with long barrel and muzzle weight.

                                                                                                    1. 2

                                                                                                      Browning Hi-Power GP Competition

                                                                                                      Nice! Any opinions on the CZ comp models?

                                                                                                      1. 6

                                                                                                        Most 75/85 pattern matchguns are made with IPSC type shooting in mind: quick draw, high speed, large targets at close range. I do Nordic field shooting which is more precision oriented. It’s 6 shots per hold, typically at 25m but can vary from 15 to 180m. For IPSC you want one that can be quickly reloaded, has high mag capacity, accepts red dot sights, and is not unwieldy to draw. For Nordic it’s iron sights only so priority is on the largest sightline and the longest barrel (restricted to 6”).

                                                                                                        I never shot CZ but used a Tanfoglio loaner for a while, which is an Italian 75 copy. It’s entirely fine but is a handicap in Nordic events. Right tool for the job etc.

                                                                                                        1. 1

                                                                                                          This was very informative, thank you!

                                                                                                  2. 1

                                                                                                    I assume that the upside down here refers to forward to backward? Or did you literally rotate the thing about its axis?

                                                                                                    1. 1

                                                                                                      No, literally upside down: the part has asymmetric lug engaging with the barrel and slide stop, and can be inserted both ways. Somehow I messed up after doing it right a few times already.

                                                                                                  1. 23

                                                                                                    I usually steal, I mean, get inspired by a theme on another site. I then manually edit the CSS and throw 99% out, and combine with CSS from other sites. It’s usually easy to get something that looks roughly like what you want, and very hard to get exactly what you want.

                                                                                                    Of course, it won’t use the latest framework, but it’s javascript-free, artisanal, and people are usually surprised at how fast it loads.

                                                                                                    1. 3

                                                                                                      This is exactly what I did. I copied over a theme that vaguely looked like what I wanted, discarded the parts I didn’t need, then frobbed it until it looked good. (Few original LoC had remained by that time.) Some time later I rewrote the style from scratch using what I’ve learnt.

                                                                                                      1. 2

                                                                                                        This is what I did for https://bitemyapp.com/

                                                                                                        It probably helps that I have some experience typesetting and like minimal/booky themes that focus on the type.

                                                                                                        1. 2

                                                                                                          I wouldn’t say that I’m bad at CSS, but I am pretty poor at coming up with originality. So, I end up pretty much doing something similar to you.

                                                                                                          At the very least, I’ll get inspiration for design from other sites. Right now, I’m working on redoing my personal site as well (primarily my blog), and I’m really into Drew DeVault’s personal website. I also like Medium’s approach to focusing on the story content. I’ll probably end up doing an approach the combines them in some form.

                                                                                                          I once had a colleague tell me that art is just regurgitation of other art.

                                                                                                          1. 1

                                                                                                            I like the site from crafting interpreters a lot, which is also hand-crafted (as it proudly declares in the footer). I checked out the source and it contains a comment along the lines “ is so beautiful it makes me want to cry”. Robert Nystrom seems like a nice guy.

                                                                                                            Also, I really like the layout that stackedit.io generates.

                                                                                                        1. 4

                                                                                                          I rather like this idea. The single lines published on the front right now are a little basic for me to find interesting, but I do like the idea of studying an interesting line of code each day. I saw a line recently written by a colleague that while simple, I found quite elegant. I’m not sure I would have thought to apply a constructor to the result of a database action like this.

                                                                                                          risk <- Entity rid <$> runDB (get404 rid)
                                                                                                          

                                                                                                          I guess the hard part here would be curating a gallery of interesting single lines of code, or otherwise incubating a community to crowdsource that effort.

                                                                                                          1. 3

                                                                                                            I end up joining a traversal sometimes.

                                                                                                            Here’s one I was able to ripgrep from my archives: second join $ traverse (first return)

                                                                                                          1. 2
                                                                                                            • Answering the editor of my book’s questions, pushing toward a final version.

                                                                                                            • Finished moving my wife to Texas, settling in now.

                                                                                                            • Teaching a friend the basics of desktop publishing and LaTeX.

                                                                                                            • Going over the Baltimore Catechism and how it compares pedagogically with the universal Catechism.

                                                                                                            • Seeing a German Shepherd Dog tomorrow that needs a new home.

                                                                                                            1. 6

                                                                                                              Ports. The t480s has 2 USB-A ports and 2 USB-C ports. It also has a full size HDMI, SD card slot, and full-size Ethernet. Is 0.14” difference in thinness worth access to the ports, user upgrade-ability, and the longevity of the keyboard?

                                                                                                              Given that there are quite a few usb-c hubs[1], or single-use-case (eg. hdmi for presentations) dongles, out there that offer the ports in a breakout/hub/dongle format, I don’t desire a return of all the ports that I use so occasionally/seldom. Paying the size/thickness/weight tax all the time for something I use rarely isn’t a great tradeoff for me.

                                                                                                              Then again, I use a laptop to be mobile, not as a desktop replacement. I realize that not everyone does this, so ymmv.

                                                                                                              [1]: Kingston’s Nucleum has two USB 3.0 ports, an HDMI port, a SD and microSD card slot, one USB-C charging port and one regular USB-C port

                                                                                                              1. 13

                                                                                                                USB-C devices and hubs are pretty bad if you want to run more than one 4k60 display. Some can’t even do one. You can’t just plug in one hub and be done. I had to plug in three different USB-C dongles to get two 4k60 monitors, ethernet, keyboard, mouse, audio going on my 15” rMBP. Worse, USB-C slips and loses connectivity very easily.

                                                                                                                The whole situation is asinine. Yes they’re meant to be mobile but I’m not paying $3k for something functionally equivalent to a netbook on steroids.

                                                                                                                1. 6

                                                                                                                  USB-C slips and loses connectivity very easily

                                                                                                                  I missed this part earlier (or maybe you edited it in later). I very much agree with this one. I find usb-c a bit fiddlier than I would like, especially for power in comparison to the old apple magnetic (magsafe) power connectors. RIP magsafe.

                                                                                                                  1. 2

                                                                                                                    Multiple 4k60 displays seems a bit like a job for a desktop to me. That said, I agree that sucks. I wonder if it is a limitation of usb-c or just so few people with that use-case that nobody makes one that can do that yet.

                                                                                                                    EDIT: hmm. looks like a displayport 1.2 limitation, based on some searching. DP 1.2 supports a single 4K 60 Hz monitor, two 1440p 60 monitors, and so on. DP 1.3 supports more (gfx card willing), but I think usb-c/thunderbolt3 is still DP1.2. bummer.

                                                                                                                    1. 5

                                                                                                                      It’s a MacBook Pro. I was running 2 displays off a 12” Thinkpad with the dock years and years ago.

                                                                                                                      1. 4

                                                                                                                        And you can still do so if those displays aren’t 4k. The terrible industry-wide state of getting pixels from ram to screen is not Apple’s doing and any attempt they make to fix it themselves will be met with endless pearl-clutching about “proprietary connections”

                                                                                                                        1. 2

                                                                                                                          I don’t mind how they fix it, I would prefer more port types than just USB-C. I think the decision to only have USB-C is aesthetic not functionality.

                                                                                                                          1. 3

                                                                                                                            There are functional reasons to want only one port on your device. However, their decision to go about it in classic Apple fashion, making the change out of nowhere, was certainly a head-scratcher.

                                                                                                                        2. 4

                                                                                                                          A MBP will absolutely run multiple 4K displays on a single port.

                                                                                                                          Fuck, a Mac mini with just Intel graphics will run 2 4K displays, also from a single port.

                                                                                                                          1. 2

                                                                                                                            I get that it has Pro in the name. Did you use docking at every location where you worked with multiple monitors? Monitors these days also just seem huge to me. I can’t imagine someone having two 30+ inch 4k monitors on their desk ( that’s a /lot/ of terminals! ;) ) and yet choosing to drive it with a laptop. The workflow comparison between that and running undocked seems significant.

                                                                                                                            I do wonder if some portion of people get laptops just because, or on the off chance that they might do something on the go, but then they end up using them docked 100% of the time anyway. Definitely not saying this was you though, as I have no clue how you worked or used your machines.

                                                                                                                            1. 5

                                                                                                                              Some people don’t buy laptops but their company only provides laptops. You have to be able to use the laptop as a desktop replacement if you need/want to. Heck, desktops are a vanishing breed, I imagine 90% of them are sold as gaming machines, these days.

                                                                                                                              1. 2

                                                                                                                                Chiming in with an anecdote, but I will emphasize this is my singular experience and preference.

                                                                                                                                I have a 2015-era Thinkpad X1 Carbon whose built-in display is 1440p. Most of my programming uses, I use it docked to an additional 1440p display, sometimes two and turn off the built-in screen in favor of two full-sized monitors. In both cases they are only 25” displays, but the additional pixels are very appreciated. I don’t really see myself upgrading those to 4K screens, but I can imagine others who might.

                                                                                                                                Some non-programming tasks also benefit greatly from the extra screen real-estate. I do will sometimes design in Figma (full screen on one monitor) with the second monitor hosting two windows: an editor window for referencing existing CSS in our projects, and a browser open to the Spec for the project whose design I am working on

                                                                                                                                I am very much in the “laptop for the off chance they might do something on the go” crowd, but those times are far from insignificant. A lot of it is on-the-go comms with my team, doing project management and product management tasks. I definitely would not be effective with only a desktop, i.e. only a phone for on-the-go productivity.

                                                                                                                          2. 0

                                                                                                                            Limiting yourself to a USB-C (protocol) dock/device when you have TB3 ports but clearly want a not-average-joe functionality makes no sense to me.

                                                                                                                          3. 3

                                                                                                                            For me, this (multiple do-almost-anything ports, vs several each do-1-specific-thing ports) is the killer thing, but it works specifically for Macs because those ports are all TB3 not “just” USB-C.

                                                                                                                            For basic things (i.e. the common complaint about the pre-TB3 MBP having “USB-A, HDMI and SD card” you can get a single USB-C ‘hub’ to provide all those ports, but whenever possible (and particularly for stuff relating to displays) I actually tend to get/suggest TB3 devices.

                                                                                                                            1. 2

                                                                                                                              My question — and the question of most people I know who have a newer MacBook Pro — why not both? Why not have USB-C ports and a HDMI? TB3 is awesome but it doesn’t have to be exclusive.

                                                                                                                              1. 4

                                                                                                                                It’s entirely possible Apples reasoning is aesthetic, but to me, a HDMI port is useless, and usually adding a HDMI port means you lose something else (see: the 2018 Mac mini that only supports 2x4k displays over TB3 because the third ‘supported’ display must be over HDMI).

                                                                                                                                HDMI is also one of the least-hard “problems” to solve: you already need a HDMI cable, so use a different HDMI cable, with USB-C on one end.

                                                                                                                                1. 2

                                                                                                                                  You’re right. The Mac mini is a really good example of a combination of ports that folks really enjoy having access too.

                                                                                                                                  This is all a tangent though, the reality is Apple is bent on making their laptops like their tablets and I wish they wouldn’t. In the end though it’s all preference.

                                                                                                                                  1. 3

                                                                                                                                    reality is Apple is bent on making their laptops like their tablets

                                                                                                                                    Maybe the reality as you see it, but until they add touch screens to their laptops, I’m going to remain pretty dubious about that viewpoint.

                                                                                                                                    1. 2

                                                                                                                                      You missed my point. Not sure if that was deliberate or not.

                                                                                                                                      The Mac mini has HDMI.. for some reason, but because it does, you can’t run 3 DisplayPort 4K displays from it. You can run two DP, and one has to be HDMI.

                                                                                                                                      I would be happier if the mini had forgone HDMI for more TB3 ports (or even dedicated (mini) DisplayPort would be better than HDMI). I’d even give up the USB-A ports for more TB3 ports.

                                                                                                                                      reality is Apple is bent on making their laptops like their tablets

                                                                                                                                      I really cannot agree with that at all and I wonder if you somehow don’t understand that TB3 and USB-C are not the same thing.

                                                                                                                                      1. 2

                                                                                                                                        you can’t run 3 DisplayPort 4K displays […] I really cannot agree with that at all and I wonder if you somehow don’t understand that TB3 and USB-C are not the same thing.

                                                                                                                                        Well, if we are going to be pedantic ;). If you use DisplayPort 4K displays, you are not using Thunderbolt 3, you are using the USB-C DisplayPort alternate mode. They are separate things, since there are also machines that have USB-C ports that support DisplayPort alt mode, but not Thunderbolt 3, such as the MacBook 12” [1].

                                                                                                                                        So, why do you care about USB-C Thunderbolt 3 ports if you are going to hook up a DisplayPort display?

                                                                                                                                        (BTW. it seems that Apple’s wording is intentionally muddy here for marketing purposes.)

                                                                                                                                        [1] https://support.apple.com/en-us/HT206587

                                                                                                                                        1. 1

                                                                                                                                          I use a TB3 to dual DisplayPort adapter, so it only takes one port. I can guarantee you it is not using USB-C alt-mode.

                                                                                                                                          1. 1

                                                                                                                                            Now you are adding new data points. The default (and much cheaper) thing to do is to hook up a DisplayPort display directly to a Mac Mini or MacBook. Which is done using a regular passive DisplayPort <-> USB-C cable.

                                                                                                                                            1. 1

                                                                                                                                              No, I’m not.

                                                                                                                                              You asked what’s wrong with a HDMI port. I told you: takes away video streams that would otherwise be available over DisplayPort.

                                                                                                                                              Whether they’re routed over 3 USB-C to DP cables using Alt Mode, or via a TB3 adapter is irrelevant.

                                                                                                                                              Go look at any tech forum with people having issues with displays: a decent chunk of them it’s because they’re using HDMI, because it was literally designed for TVs and receivers, being used for computer displays is an after thought, and it’s very apparent.

                                                                                                                                              1. 1

                                                                                                                                                HDMI doesn’t “take away” video streams, Apple does. If Apple really wanted, they could’ve added ability to use 3rd video stream using USB-C, but they didn’t. There is really nothing stopping them, except maybe the Intel chip that may not have a 3rd DP output.

                                                                                                                                                1. 1

                                                                                                                                                  The UHD 630 supports 3 displays over dp hdmi or edp.

                                                                                                                                                  Apple chose to include hdmi which means one of those outputs from the igpu is used or “taken away” from potential as a DP output over USB-c/TB3.

                                                                                                                                    2. 1

                                                                                                                                      It’s entirely possible Apples reasoning is aesthetic, but to me, a HDMI port is useless, and usually adding a HDMI port means you lose something else (see: the 2018 Mac mini that only supports 2x4k displays over TB3 because the third ‘supported’ display must be over HDMI).

                                                                                                                                      HDMI 2.0 supports 4k displays. The Mac Mini specs explicitly state that you can drive three 4k screens:

                                                                                                                                      Up to three displays: Two displays with 4096-by-2304 resolution at 60Hz connected via Thunderbolt 3 plus one display with 4096-by-2160 resolution at 60Hz connected via HDMI 2.0

                                                                                                                                      https://www.apple.com/mac-mini/specs/

                                                                                                                                      1. 1

                                                                                                                                        That’s what I said. It forces one display of the three to be hdmi, which IMO is garbage compared to DP. I’d rather have no HDMI and be able to drive 3 displays over TB3/DP

                                                                                                                                        1. 1

                                                                                                                                          Your comment was vague, it seemed to suggest that you cannot drive three 4k displays, but the point is that one of them has to be driven through HDMI. Fair enough.

                                                                                                                                          Apple’s rationale is very logical. Quite some people use Mac Mini’s as media centers. They’ll have a TV with HDMI connectors and HDMI cables. So, it lowers the friction for a significant chunk of the audience for a tiny subset that insists on driving three 4k displays through DP. I am not saying that it is not a legitimate use case, but a niche. Apple will probably tell you to buy a Mac Pro or something.

                                                                                                                                          1. 1

                                                                                                                                            What is vague about this:

                                                                                                                                            the 2018 Mac mini that only supports 2x4k displays over TB3 because the third ‘supported’ display must be over HDMI

                                                                                                                                            I would bet money Apple do not include HDMI on a Mac mini for those few people who still try to run a media centre on one. Apple’s “solution” (in terms of what they support feature wise and expect people would use) is AppleTV.

                                                                                                                                            They provide HDMI because it’s designed as a “bring your own display” device and a bunch of cheap shit displays have HDMI input rather than DP.

                                                                                                                                    3. 2

                                                                                                                                      Another reason is that the HDMI connector is bigger than the side of the MacBook Pro. Mini and micro HDMI connectors could fit but hey, even if it’s HDMI you need not-so-common adapters or special cables so USB-C/TB3 is not a bad alternative.

                                                                                                                                  2. 2

                                                                                                                                    The t480s does have 2 USB-C ports for breaking out to more exotic ports but having a nice selection of ports is great.