1. 1

    Is it cheating to use the stdlib function that already does the work?

    (frequencies "aaaabbbcca")
    ;; => {\a 5, \b 3, \c 2}

    Or if you wanted to respect the types in the OP:

    (->> "aaaabbbcca"
               (map (fn [[k v]] [(str k) v]))
               (into []))
    ;; => [["a" 5] ["b" 3] ["c" 2]]
    1. 2

      Frequencies doesn’t help here. “A” needs to be in the output twice.

      1. 2

        Check the requirements again, it’s not frequency, it’s “runs” of characters.

        I started working on this in Perl then rapidly lost interest when I saw what was required ;)

        Edit changed my mind, here’s a straightforward solution, slightly golfed to fit in 24 lines https://gist.github.com/gustafe/117768d83df175b308aa15dcc75d2061

      1. 2

        The only thing missing is org mode…

        1. 2

          I recently started using org-roam and org-ref to build up a personal knowledge database with an eye to writing papers on Scottish music history, and it’s been great so far. Highlights include:

          • The full markup power of org-mode (similar to Markdown, but IMHO more expressive)
          • The benefits you mentioned of everything being plain text, working with git, etc.
          • Interactive visualizations with org-roam-server
          • Really effortlessly looking up backlinks (the entire point of org-roam)
          • Integrating with org-mode’s todo/agenda system to spin off things to do and keep track of them (frequently I’ll be reading a paper and add a todo to look up some obscure source that only exists in a specific research library, for example).
          • Relatedly, turning my todo items into a kanban board
          • Pulling together all my notes so I can write something formal, and having the org file get turned into a beautiful PDF (via LaTeX) all from within Emacs
          • Painlessly inserting citations from a dedicated bibliography file I maintain, with whatever format is needed.
          • Using org links / org-roam to keep track of annotations on the sources themselves.

          And what’s wild is I still feel like I’m scratching the surface.

          After a few weeks I have 219 notes containing 10,000 words and ~350 links. It’s really wonderful how effortless it is to spin up a new note.

        1. 5

          I’m doing reading that I think will be helpful for my grad school application (master’s in Scottish Ethnology) and have just discovered the magic of org-roam for Zettelkasten-style note-taking in Emacs. This week I produced 3300 words of notes spanning 93 files, but I’m a little behind on my reading plan and want to catch up this weekend. There are also a few org-roam features that I’m aware of but need to learn how to use, such as tagging and launching a server that dishes up an interactive mind map

          Would love to talk to anyone who has experience with humanities grad school, org-roam, etc!

          1. 2

            org-roam is fantastic! Especially when paired with org-protocol, you can add a reffed entry straight from your browser. If you are in school and writing lots of papers, org-ref plays nicely with it as well which is a game changer if you re the sort to write lots of papers. Its one of those things where I wished I had a use case because the workflow was so nice.

            1. 1

              Good to get the encouragement about org-ref. I’ve been handling that very manually right now and it’s not great.

              On the one hand it’s a little overwhelming to figure out how to use all the relevant bits of the org ecosystem, but on the other it’s nice that I can be productive now and still have room to become more efficient by doing some toolsmithing. I’m excited for my setup to evolve. And, for that matter, am excited for when I have 100k words of notes spanning 500 files. A lot of papers is the goal!

              It’s an interesting place to be: there’s still a lot of low-hanging fruit in the field (18th-century Scottish music history) since not many people are working on it and the internet has made so many more primary sources easily available. A lot of the top scholarship was written in the ’80s and was an admirable effort, but of course they were limited by having to physically travel to many far-flung libraries and use incomplete physical card catalogs to access materials.

          1. 5

            It looks amazing. I look forward to getting a pinephone once my current phone dies.

            I have looked at the repository and noticed that the programs are written in C. Would a different language be a better choice to write and maintain such an environment? It is hard for me to propose an alternative, I am mentioning this because it seems like C with all its advantages has many issues as well and maybe a fresh start (kind of new platform?) would allow using different tools. For tools as simple as https://git.sr.ht/~mil/sxmo-utils/tree/master/programs/sxmo_setpineled.c wouldn’t a shell script be a better choice?

            Additnally, the file mentioned above looks suspicious to me – sprintf to a 80 bytes buffer regardless of the input, no free to malloc, program can return a negative value.

            1. 3

              no free to malloc

              There is no point in freeing blocks at the end of a program

              To your larger point, I’m not surprised that suckless attracts a lot of C hackers, and I’m not surprised that C hackers prefer to write certain types of tools in C instead of bash.

              1. 2

                The C is fine – slightly overly clever. But I agree – it’s a lot of code to run:

                if [ $2 = white ]; then
                echo $3 > /sys/class/leds/$1:$type/brightness'
                1. 2

                  Yeah, this specific program would likely be better as a shell script, especially since the C program calls sh to write to the brightness file anyway.

                  1. 1

                    especially since the C program calls sh to write to the brightness file anyway.

                    That seems silly… are there any valid reasons why it wouldn’t just open the file and write to it directly?

                2. 1

                  i really want to explore using D for this, with rust or zig as slightly less compelling options. i feel like all three would be better than C.

                1. 2

                  I’ve finally reached the tipping point of {running out of Dropbox space, hating YT Music for playing my personal MP3 collection (I used to be on Google Play Music), being worried about Google Photos changes} and have decided to roll my own solution.

                  Several approaches come to mind, and I need to figure out what the right subset of the following is:

                  • Install Syncthing on an old laptop and keep it running 24/7
                  • Regular backups of that to Backblaze or Tarsnap or something
                  • Install Syncthing on a DigitalOcean VPS
                  • Buy a NAS
                  • Buy a server on Craigslist
                  • If I stick with the pure Syncthing route, use local photo viewers, music players, etc.
                  • Otherwise, investigate Ampache and Funkwhale for music
                  • Investigate photo apps (Piwigo and…there must be others)
                  1. 1

                    I’m very interested in hearing how this turns out! I’m in the same boat, Google Play Music was okay, and I had a bit of my own collection uploaded. YouTube music is terrible though, but I don’t see any reasonable alternatives at this time..

                    I have gone down the NAS route already, but gave up on both photos and music (some ill-formed ranting is here: https://dpzmick.com/posts/2020-02-01-homelab4-cloud.html). In short, nothing I found off-the-shelf to run on the server really worked for photos/music either.

                    1. 1

                      I’m pretty happy with my music solution now:

                      1. The “source of truth” copy is on an old laptop running Debian testing and syncing with Syncthing. Uptime is currently 17 days.
                      2. I have two folders, music/core-set and music/archive. The former syncs to both my main laptop and my phone, the latter only to my laptop (to save space on my phone). They’re 22GB and 1.5GB respectively, so maybe I should clean up a little harder. But there’s plenty of space on my phone.
                      3. I’ve been experimenting with different music players on my phone. It’s nice to have options. Currently I’m using Metro and it’s fine. I plan to try out Odyssey at some point.

                      I do not yet have an off-site backup (apart from YT Music). I plan to set one up soon, but I figured the odds of two computers at home and the phone in my pocket all blowing up at the same time this month were slim.

                  1. 5

                    I have been using this as my daily-driver since July and very happy so far.

                    1. 3

                      I just looked at the calling/texting demo video, and while it’s really cool to write a text in vim, the entire process seemed pretty time-consuming with several menus to navigate with the volume rocker, etc. Once you get used to it, do you find the UI as fast to use as a more conventional touch-based UI?

                      1. 3

                        I don’t use their calling/texting features (I’m a jmp.chat user) but I find the button shortcuts very handy for sure, and the UI is much snappier than Android so even an extra tap now and then doesnt add time overall IME.

                    1. 43

                      To echo my thoughts: I think this change is welcome. As I see it, there’s no downside to changing this default.

                      1. 55

                        I consider the imposition of a distributed cost across the entire git-using ecosystem a downside. This is not a one-sided tradeoff.

                        1. 26

                          I know I’ve personally hard coded the word “master” in at least a few scripts. Fixing those scripts won’t just be a matter of changing “master” to “main” either; I’ll have to add a bunch of logic to figure out what the default branch name is for a particular repo. It’s also not clear what to do with old repos; do I keep the name “master” for old repos and adapt the word “main” for new repos? Or do I rename the master branch to “main” for all my old repos and possibly break things?

                          I’m not really opposed to the change. I’m usually happy to change language to move society into a less casually racist/sexist/whatever direction. But this change will make things quite a bit more difficult, on a technical level, for millions of users, so I sure do hope the benefit is worth it. (Which, to be clear, it might. I’m in no position to judge. In my native language, our word for “master” doesn’t have history it apparently has in the US.)

                          1. 25

                            change language to move society into a less casually racist/sexist/whatever direction

                            I agree, getting rid of casually racist/sexist/asshole terms is a good thing. But, this whole situation implies that the word ‘master’ is inherently racist, which it is not. To illustrate, let’s make the exact same argument about the word ‘blanket.’ I’m Native American, many of my ancestors suffered and died to the disease smallpox, sometimes believe to be intentionally spread using infected blankets now known as ‘smallpox blankets’ 0. Now, intentionally spreading disease with the intent on decimating a population is extremely racist, bordering on genocide. Whether it actually happened or not is beside the point, it’s ingrained in popular culture (in the US) as something that probably did happen to some extent. Now, for some, the word ‘blanket’ can bring up “memories” of their ancestors suffering (or even their own ongoing suffering), but does that make the word ‘blanket’ racist?

                            our word for “master” doesn’t have history it apparently has in the US

                            It doesn’t here either. The word has many uses, most of which range from neutral to positive (master copy, masters of science, etc.). Referring to someone as a master in certain contexts, such as when a student of martial arts, is a sign of respect.

                            Frankly, I have enough garbage to deal with, adding another headache on top of it just to satisfy some ‘woke’ assholes doesn’t appeal to me. Censoring language is a bad mechanism for suppressing racism, and is IMO more detrimental to society than the problems it’s seeking to solve.

                            1. 12

                              “Master” is often paired with “slave” in CS and IT (busses, DB replicas, etc.), which is why it’s on the list of exclusionary terms. Git doesn’t use “slave” in relation to its master, but given the prevalence of “master/slave” wording, why continue using a term that makes some people uncomfortable?

                              1. 14

                                why continue using a term that makes some people uncomfortable?

                                Because the shift imposes a distributed cost on the entire git-using ecosystem. Examples: every forge site needs to build out this feature instead of others, everyone needs to check their scripts, etc. Imposing distributed costs needs to be done very carefully, because even a couple of hours × a lot of people = a lot of person-hours spent.

                                This is an expensive move to make. For it to be worth doing, the benefit of the change needs to be worth the effort spent and I have seen no serious attempt to quantify this.

                                1. 20

                                  Does it actually make people uncomfortable? That’s besides the point of my argument, which is that words have flexible meanings and are extremely context dependent. Censoring a word because when used in a specific context (in this case, specifically human slavery) it can have a negative meaning simultaneously erases innocuous uses of the word, and strengthens the negative connotations. By actively trying to suppress usage of a word, you make the word more powerful in it’s negative usage.

                                  But really, all you need to do is actually read the last paragraph to know why I disagree with this. Changing 15 years of convention for something like this is needless headache.

                                  1. 5

                                    If it makes people uncomfortable, we could probably confirm that over in music performance and production, where “master” (master recording, remastered) is a frequently-used term and racial diversity is slightly less of an issue. My mediocre research skills haven’t found anything either way yet. Maybe we should just ask some Black artists.

                                    1. 5

                                      No one is suppressing anything. You can still use whatever name you want for your branch. Don’t blame software developers for adapting to a more inclusive culture. Especially when you are not part of the people affected by it.

                                      1. 15

                                        Until you end up being publicly shamed by thousands of “inclusive” virtue-signalling bullies.

                                        1. 3

                                          If you wanna complain about Twitter bullies, do that. However, “this move from the git project is bad because other people may eventually be assholes” isn’t… the greatest argument I’ve heard.

                                          1. 1

                                            Shamed for what reason? I’ve seen many people arguing against initiatives like this one and no one cares. Someone even started a petition on change.org to not change it and no one cares.

                                            1. 14

                                              If this takes, I give it a couple of years at most until someone starts yelling about a project that did not switch or even worse - gasp - started with the master branch instead of main. How insensitive and unwelcoming!

                                              A venue enabled by buying into this virtue signalling crap and actually making it a thing.

                                              1. 1

                                                Right. So you went from a thousand people publicly shaming to someone yelling.

                                                1. 11

                                                  From what I’ve seen, one person yelling leads to a tweet, leads to the eventual Twitter mob.

                                                  1. 1

                                                    Sure, but for saying what? @mordae is saying that would happen because someone decided to use “master” instead of “main”. Which seems farfetched.

                                                  2. 4

                                                    I remember Stallman.

                                                    1. 2

                                                      I think that was a bit more complicated than just naming a git branch.

                                          2. 1

                                            Does it actually make people uncomfortable?

                                            Yes. Yes it does … there is no use of the word as it relates to version control that doesn’t derive from human slavery, specifically.

                                            1. 4
                                              1. 1

                                                Fine, edited for additional clarity, though all those meanings derive from the PIE meaning of “one who has greater power”.

                                      2. 8

                                        I’ll have to add a bunch of logic to figure out what the default branch name is for a particular repo.

                                        What is a default branch? When I create a new repo, Git gives me a default branch, sure, but the moment after that command completes there’s never been a guarantee that the master branch exists.

                                        I know I’ve personally hard coded the word “master” in at least a few scripts.

                                        Unfortunately this was never quite correct, technically. My personal workflow is to always remain in a detached HEAD state and to not have any sort of “main”/“default” branch locally, so these scripts don’t quite work for me. If they were only supposed to support your workflow, you can keep using the old config setting without issue.

                                        1. 9

                                          What is a default branch? When I create a new repo, Git gives me a default branch, sure, but the moment after that command completes there’s never been a guarantee that the master branch exists.

                                          Here’s a concrete example.

                                          At work, we use this build system called bitbake, together with the yocto project, to build an embedded Linux distribution. The idea is that you build recipes which describe where to fetch some source code (usually in the form of a git URL + a commit hash + an optional branch) and how to compile and install the source code, and bitbake handles the rest.

                                          I threw together a script to go through all of our recipes and figure out which recipes are outdated. To do this, it fetches the repo and checks if there are commits since the commit hash specified in the recipe. This is no problem if a branch is specified in the recipe, but what do I do if it isn’t? Instead of looking deep into the guts of bitbake and figuring out how exactly its logic for figuring out what the “default” branch is, I just defaulted to “master”.

                                          There are obviously ways to do it “correctly”, and hopefully tools like bitbake, which are actually seriously and actively developed as a kind of product, do it the right way. However, there are loads of scripts which do things the easy way instead of the 100% correct way; essentially scripts which automate the steps which the author would’ve gone through manually just to make life a bit easier. Most likely, the solution in the case of the aforementioned script is to just keep track of whether a branch is specified, and, if it’s not, just omit the branch argument. My point isn’t that fixing these scripts is hard, but that there are loads of these scripts which will have to be fixed.

                                          1. 4

                                            I’m not the OP, but I think it’s reasonable to have, for example, a script that deploys master to an environment and is SHA-agnostic.

                                          2. 1

                                            I’ll have to add a bunch of logic to figure out what the default branch name is for a particular repo

                                            I thought so too, but I got away with just using HEAD everywhere. It’s an alias for the actual main branch, whatever it’s called.

                                            1. 4

                                              HEAD is not an alias for a branch. If you do git checkout alt-branch, HEAD will point at the last commit of alt-branch. If you again do git checkout main-branch, HEAD will point at the last commit of main-branch. If you’re in the middle of an interactive rebase, HEAD will point at a commit that in general won’t be the last commit of any branch. You can do a git checkout commit_hash which will detach your HEAD from any branch and it will only point at this particular commit. Generally, HEAD points at the commit that you have checked out locally at the moment, the one that will be the parent of the next commit you make.

                                              1. 3

                                                Works well enough for remote HEAD.

                                                1. 1

                                                  Right, so in practice (found this with a quick search):

                                                  • If you clone a fresh repo in your script, HEAD should point to the default branch, until you switch branches. This might work for some scripts, depending on the situation.
                                                  • If you want to know which branch is the default, it looks like git symbolic-ref refs/remotes/origin/HEAD | sed 's@^refs/remotes/origin/@@' does the trick.
                                                  • If you want to know the default branch on a remote, you can do git remote show [your_remote] | grep "HEAD branch" | cut -d ":" -f 2.

                                                  These all feel like somewhat of a hack. With git changing this default, I wish there would also be some new built in commands. For example they could provide the default branch locally and on a remote directly, without needed to use sed or cut. Personally I’ve never written a script that needs to know the default branch name, but it sounds like some people have.

                                                  1. 4

                                                    I think that the entire issue rests with misunderstanding of git. In git, “default branch” is a matter of policy, not mechanism. It’s entirely up to the user. There is something like an “initial branch”, but that’s all. Git doesn’t mandate that a branch named so-and-so should have any special significance. So scripts trying to detect a “default branch” get it all wrong, because there is no such thing for all uses of git. Your organization may use git in one particular way where some branches have special significance and in this case, the policy of your organization should be hardcoded into your scripts. But those scripts won’t work for others. There are things like push and pull targets that may have some overlap with what people are looking for really.

                                                    1. 1

                                                      That makes sense, that’s a good description. I have never personally written a script that hard codes master, I just hear about other people doing it.

                                            2. 3

                                              OTOH I’ve seen developers notice they’ve been using hardcoded master where they should have been using HEAD, and fixed their code. master was always just a default, never a requirement, so code that assumed this particular name wasn’t robust.

                                              1. 0

                                                you can always use an alias in your shell

                                                1. 10

                                                  This is literally an instance of the “imposing a distributed cost” that I was talking about.

                                                  1. 2

                                                    Okay I understand and I am sorry I was not clear with my statement. I believe this is a direct cost of time and effort to mitigate, which in my humble opinion is an arbitrary and unnecessary syntax change to established code. However, I only meant to point out that a shell alias could be used to make it a less of a hinderance.

                                                    1. 2

                                                      I appreciate the apology, thank you.

                                            1. 3
                                              • I’m taking private lessons in Renaissance counterpoint, and have homework (writing three-voice settings of old English dance tunes) this weekend
                                              • Helping a friend move
                                              • Continuing to tweak my new StumpWM setup
                                              1. 2

                                                I realize there’s a lot to criticize about git here, but I read it in good faith and got the following out of it:


                                                From git --help config:

                                                To avoid confusion and troubles with script usage, aliases that hide existing Git
                                                commands are ignored

                                                I don’t understand why Master Git said “there was no problem” though.

                                                One Thing Well

                                                From git --help checkout:

                                                Updates files in the working tree to match the version in the index or the specified tree. If
                                                no pathspec was given, git checkout will also update HEAD to set the specified branch as the
                                                current branch.

                                                I think of it as “make the working tree correspond with a branch”, remembering that branches are just pointers to commits and thinking of HEAD as a special branch that points to the current branch.

                                                Only the Gods

                                                I always think of git history as something that should be massaged to tell the story you want, not as a complete accounting of the facts. Branches are designed to be ephemeral and help you, not the narrative.

                                                The Hobgoblin

                                                So frustrating.

                                                The Long and Short of It

                                                The -h / --help distinction isn’t very UNIXy, but it is convenient. git -h branch not working seems like a frustrating omission though.

                                                1. 4

                                                  I agree…but at the same time isn’t conventional wisdom usually to let the library authors deal with something because they have more time/use cases/expertise/community bug reports/wisdom to Do It Right? At some point you end up with a bunch of crappy internal tools that cover your specific use cases tolerably-but-not-perfectly and a really bad case of NIH Syndrome

                                                  1. 3

                                                    It’s also possible that if adding a random library were more difficult, people would just copy chunks of code from the random library instead, and still won’t take the time to understand it and fix it instead of working around it. At least if it’s easy to add a library bugs might get fixed upstream.

                                                    1. 5

                                                      Copy chunks from a random library? Nahhhhhh, that would never happen. Who would do that? :P

                                                      The flip side is that if there’s a bug in these copy-pasta libraries, it’s potentially more evident to the downstream maintainer and they might be more motivated to fix it, since it’s part of their program and they don’t have to cooperate with anyone else to get it done. I’m not sure one model is better than the other though.

                                                      1. 1

                                                        it’s potentially more evident to the downstream maintainer and they might be more motivated to fix it, since it’s part of their program

                                                        Especially with legacy C++, where the simplest way to include a library was to copy it into your source tree, there are lots of cases where the library source code is technically under downstream control, but in reality no-one has looked beyond its external API, so they’re just as likely to apply an external bodge as they are to study the library source code, find the real issue and fix it properly.

                                                  1. 3
                                                    • Desperately hoping to receive an acceptance letter from $NEW_JOB…otherwise I’ll be back to the drawing board finding and applying for something new.
                                                    • Doing a big refactor of the accounting code at $OLD_JOB, which is a major pain in the neck, but it’s good to leave behind one last positive change (I already put in my notice)
                                                    • Recording on my pochette for a samples library
                                                    • Preparing for my wedding next month!
                                                    1. 3

                                                      Recording some samples on [my pochette](https://en.wikipedia.org/wiki/Pochette_(musical_instrument\)) for a samples library, rehearsing for a gig, futzing around with various wrinkles of org-mode.

                                                      If there’s time, I have renewed interest in my Clojure library that parses a text-based music notation and want to start adding tests, refactoring some really gross bits I came up with five years ago, and extending it.

                                                      1. 6

                                                        As an amateur Common Lisper and professional Clojurian, it bothers me when people learn Clojure, get excited about “a Lisp”, and then start touting a bunch of features that have everything to do with Clojure being functional and nothing to do with it being a Lisp*. Pure functions and immutable data structures are neat, but they’re just as neat in Haskell or Elixir or OCaml or whatever—and arguably FP in Clojure would be even more powerful with better typing.

                                                        It seems like CL’s focus on macros (and DSLs), multi-paradigm programming, an incredibly sophisticated object system (CLOS / the MOP), sophisticated error handling (conditions and restarts) and so forth has dropped out of current discussion. I realize half of that is CL-specific, but at the very least I wish there was more recognition of 1) why Lisps uses S-expressions and 2) the fact that Clojure is relatively unique among Lisps for using immutable data structures and defaulting to laziness.

                                                        * The author did mention reader conditionals, but the specific use case is supported by other languages too

                                                        1. 1

                                                          I am new to Clojure, and I can echo your sentiments. Lots of stuff about the functional part of Clojure, but not too much of the Lisp side. Do you have any links that go into the Lisp side of things?

                                                          1. 3

                                                            Standard literature is:

                                                            Practical Common Lisp for a general overview of CL

                                                            On Lisp for advanced macro hackery

                                                            Object-Oriented Programming in Common Lisp: A Programmer’s Guide to CLOS. You may also like diving down the C2 Wiki rabbithole.

                                                            The Art of the Metaobject Protocol (C2 Wiki)

                                                            1. 1

                                                              Thank you! I’ve also done some fennel-lang programming, and they seem pretty much the same besides the ecosystem.

                                                        1. 4


                                                          • Continuing to lead a reading group that’s working through Learn You A Haskell For Great Good. So far it’s been very satisfying!

                                                          • Finishing up a refactor that takes two very-similar-but-not-quite-the-same models and merges them into one. (Why do we have two? Dev team politics from over a year ago)


                                                          • Finishing up some fiddle tune compositions for the annual collection that a music camp I teach at puts together.

                                                          • Having sinus surgery…I’m excited to stop getting sick as often, breathe better, and have clearer speech!

                                                          1. 5

                                                            My first hobby is computer science (which happily also pays the bills), my second hobby is the history of Judaism and Christianity (note that I am neither Jewish nor Christian)…so this is right up my alley. :)

                                                            It’s a fun thing to note that in both computer science and western theology, every single one of those example programs could be argued to be both right and wrong simultaneously (for example, there are non-Trinitarian Christians and there are programmers who would argue that the assertions in the Trinity example violate transitive identities…which they do, that’s part of the so-called mystery of the Trinity…).

                                                            EDIT: Actually, it’s funny that the JavaScript Trinity program uses == and not ===. I am amusing myself thinking of the implications.

                                                            1. 2

                                                              there are non-Trinitarian Christians

                                                              I’d love to learn more about this. The Trinity seems fairly well-defined by the Nicene Creed, the Chalcedonian Definition, etc.

                                                              I realize that, say, Mormons reject the Trinity…but I also wouldn’t consider Mormons to be Christian

                                                              1. 2

                                                                Some links for your enjoyment, then:

                                                                From experience, nontrinitarianism is pretty common among (Dutch?) Mennonites, and per Wikipedia it also is, or has been, common among various other flavours of Anabaptism. Also Jehova’s Witnesses, Oneness Pentecostals, and presumably lots more flavours of Christianity besides. You’ll get even more if you start looking at the difference between (a) what is prescribed by the flavour people identify with, versus (b) what those same people say when you ask them “do you believe that [some specific doctrinal point]” – I promise you Dutch Catholics are going to give massively different answers from Argentine ones. Christianity is a super large, widespread, and varied family of religions…

                                                              2. 2

                                                                Actually, it’s funny that the JavaScript Trinity program uses == and not ===. I am amusing myself thinking of the implications

                                                                That’s where I also noticed most of the undefined behaviour too ;D

                                                              1. 17

                                                                So, what’ve you been paid and what are you being paid now?

                                                                Here, putting my money where my mouth is: 55K -> 60K -> 125K -> 160K now, not including contracting and consulting and founding and other misadventures. All base, not counting (usually laughable, never worth it) equity.

                                                                1. 12

                                                                  Approximations from memory with some kind of parseable format

                                                                  2008,37000,39000,first dev job
                                                                  2009,42000,48000,merit raise
                                                                  2010,53000,62000,merit raise
                                                                  2011,64000,70000,merit raise
                                                                  2012,75000,115000,merit raise + acquisition
                                                                  2013,81000,83000,COL raise
                                                                  2014,115000,120000,role change
                                                                  2015,117000,121000,COL raise
                                                                  2016,124000,127000,merit raise
                                                                  2017,140000,140000,retention raise
                                                                  2017,176000,195000,new job with reports
                                                                  2018,183000,202000,COL raise
                                                                  2019,140000,170000,laid off in end of 2018 with new job early 2019
                                                                  2020,140000,174000,new bonus and RSU structure kicks in
                                                                  1. 3

                                                                    Can I ask, what is tc?

                                                                    1. 8

                                                                      Total Compensation, which is generally calculated as salary + bonuses + equity if RSUs and not options. Some folks will include 401k in it, but that’s rare because 401k matches are all over the place and are a function of your salary anyway.

                                                                      1. 3

                                                                        That helps, thank you both.

                                                                      2. 7

                                                                        My guess is “total compensation” i.e. salary + bonuses

                                                                    2. 4

                                                                      From 2012 to now: $60k -> €63k -> €68k -> €78k -> €110k -> €98k. A couple of those years I also got around €35k in bonuses, but those will probably prove to be outliers in the long run.

                                                                      I took a pay cut at the start of the year to have a job with more flexible hours and less stress so I could spend more and better time with my family. It has been 100% worth it and I wish I’d done it sooner.

                                                                      1. 4

                                                                        In terms of cash, I’ve gone:


                                                                        2010-11: $7.25-$10/hr (I was a high schooler / college freshman)

                                                                        2012: $15/hr interning where @colindean was at the time


                                                                        2013: $25/hr at a startup

                                                                        2014: $75k/yr + RSUs at my first long-term full-time job

                                                                        2015: $90k/yr + RSUS (promotion)

                                                                        2016-2018: $90-150/hr doing freelancing

                                                                        2018: $95k/yr + a little equity working 3/4 time at a startup

                                                                        2019: $145k/yr + more equity switching to full-time and also getting a raise

                                                                        Almost all of this has been full-stack web development in Rails or Clojure.

                                                                        1. 2

                                                                          Oh hai!

                                                                          1. 3

                                                                            Hope things are going well in your post-IBM life! I miss the burgh!

                                                                        2. 3

                                                                          In US, various places, mainly Kansas City and Phoenix, currently Pittsburgh. The older figures are VERY vague though.

                                                                          2008,32000,33000,First job as baby sysadmin tech
                                                                          2009,37000,39000,raise + bonuses + overtime
                                                                          2010,28000,30000,then absconded to grad school.
                                                                          2011,21000,22500,Grad school kinda sucked
                                                                          2012,21000,22500,but I finished it with no debt
                                                                          2013,24000,25000,though moving to Seattle was a mistake.
                                                                          2014,58000,61000,Working in oilfield stuff pays the bills
                                                                          2015,46000,47500,but takes its toll in mental health.
                                                                          2016,56000,62000,Academia is better
                                                                          2017,57000,63000,but the hamster wheel gets awful
                                                                          2018,41000,42000,and I should have quit way earlier.
                                                                          2019,75000,81000,So here I am at a mid-life startup
                                                                          2020,78000,84000,and I love it.

                                                                          I’m currently rather underpaid, judging by @colindean ‘s awesome survey, but I wouldn’t get to help build flying robots at Facebook or whatever. You don’t get to take money with you after all, and I’m literally posting this during a work trip to a helicopter factory.

                                                                          1. 2

                                                                            Boston area, software developer, primarily backend.

                                                                            • 66 (base, thousands of USD), starting job out of college in 2011, where I had interned before
                                                                            • 69, standard raise
                                                                            • 88, changed employer, 2013, did not negotiate
                                                                            • 99, when manager noticed how little I was paid
                                                                            • 103, standard raise
                                                                            • 106, standard raise
                                                                            • 108, standard raise
                                                                            • 118, raise when I pointed out how badly underpaid I was
                                                                            • 142, changed employer in 2019 and actually negotiated my salary (although insurance plan not as good, which cuts several thousand out of this)

                                                                            I could probably be making 150+ depending on employer, or 180+ if I worked for an employer I hated.

                                                                            I’ve tried mentioning my salary to other developers in contexts when it made sense, but they’ve never offered, and I’ve never asked. Not really sure how to get that conversation going.

                                                                            1. 1

                                                                              A friend of mine did very well on his startup equity 4 startups in a row. But yeah your mileage will vary.

                                                                            1. 2
                                                                              1. Getting a software engineering apprenticeship program off the ground at $WORK. We’re starting in three weeks, already have 15 applicants, and have a rough plan, but there’s still a lot of things to figure out. As a long-time IC it’s really interesting to me to be able to work on something like this!

                                                                              2. Figuring out how to keep a personal database of folk tunes in a simple text-based format and combine them into medleys. I just hacked something together using the C preprocessor and #include<…>, but I think the real answer is to use ERB.

                                                                              1. 2

                                                                                Not-work: The Weapons of Rhetoric: A guide for musicians and audiences by Judy Tarling

                                                                                Work: Growing Object-Oriented Software, Guided by Tests by Steve Freeman and Nat Pryce

                                                                                Fiction: Georgette Heyer historical fiction (The Grand Sophy) that a friend wants me to read.

                                                                                1. 7

                                                                                  Call me an optimist, but I’m hopeful that this can do to progressive C++ shops what Clojure did to progressive Java shops. Lots of opportunities for a Lisp to be useful there, and C++ programmers won’t be philosophically opposed to using a huge/complex language.

                                                                                  1. 4

                                                                                    Cleaning up some work code to parse written-out numbers (“one hundred and twenty-three”), then heading off to Strange Loop for the rest of the week.