1. 12

    This is a great article, and I thoroughly agree with the substance. One thing that bothered me was that in a few cases, the article uses male pronouns to talk about hypothetical candidates. E.g.:

    if I see that a person lights-up when he’s talking about programming (e.g. some cool stuff he has built over the summer/weekend) - he’s probably going to be a good developer in 2-3 years.

    (emphasis mine)

    @bndr, this is not to shame you or call you out specifically. In fact, I think this demonstrates how hard it can be to undo cultural norms: you use a non-gendered term (“a person”) in the same sentence. Another example from later on:

    they may end up liking that domain even more than they do their current one. This is self-explanatory, as the intern doesn’t have many experiences, he may suddenly find a passion for something different.

    (again, emphasis mine)

    1. 7

      Hey @mpcsh! Thanks for mentioning this, I do write “he” most of the times subconsciously , I will try to improve on this in the future!

      1.  

        Good on you. I was worried about posting this given all the hostility and divisiveness in the world. Thank you for being open and honest :)

      2.  

        Why does this bother you?

        1.  

          Because I think language is important, and being inclusive is the right thing to do. Why do you ask?

          1.  

            Thanks for the explanation. If varyibg sets of pronouns are used, would that fulfill your inclusivity objective?

            1.  

              What do you mean by “varying sets”? All that needs to be done is to change each occurrence of he/him/his to they/them/theirs.

              1.  

                Well, I’ve often seen people just just multiple personas when giving examples. “When the programmer tries her method” mixed in with “When a developer publishes his library”, and so on. Provided both show up, that should be agreeable too no?

      1. 2

        On my personal time, I’m working on shipping a personal website to gather several blog posts I’ve scattered around in Medium recently.

        I want to discover some static website generator as I’ve never used one before, trying to avoid Wordpress like the plague.

        I’m also planning to deploy it through a docker-based method I’ve standardized around recently, that gives me auto-ssl and configures nginx proxy automatically.

        1. 3

          Check out Gutenberg!

          1. 1

            Really cool static generator! I might probably go for it in the end.

            Thanks a lot!

        1. 1

          To me, the beauty of the bullet journal is that there’s no right or wrong way to do it. My personal system isn’t anywhere near the original, but it works for me. The videos and other resources are nothing but a starting point. I don’t see why the idea of bullet journaling and the system discussed in the post are at odds at all.

          1. 3

            There’s nothing wrong with bullet journaling, but there’s a productivity flaw for it, I’ve seen so many people spending too much time on beautifying their journal, or make it more minimalism, or… keep it clean, in short, it’s very easy to be distracted by the unnecessary things instead of the note/to-do list itself when you go with bullet journal.

            1. 2

              Is that a productivity flaw or just a hobby that you don’t share? There’s nothing wrong with spending time on making a journal pretty. Minimalism might be king to you, but plenty of people find relaxation and catharsis in beautifying their journals. Perhaps being “distracted by the unnecessary things” is just the way you look at your own journal / todo list; perhaps others don’t find it distracting, but enhancing.

              1. 1

                If using a tool becomes a task of its own, it’s not helping you manage your tasks.

                1. 1

                  Hobby != task. This varies person to person. For the record, I don’t beautify my bullet journal - I keep it minimal, with a different set of symbols & different use patterns than the “original”. It works for me.

                  What about those who want to spend time on prettifying it? That’s not a “task of its own”, that’s a hobby. On what authority would you tell that person that their beautified bullet journal is “not helping [them] manage [their] tasks”?

                  1. 1

                    A task is anything you spend time on. Hobbies are something you spend time on. Therefore, a hobby is a task. No inherent negative connotation there.

                    Now: what’s the point of an organizational system if you focus on the form over the function? Is the urge to beautify helping the user do what they need to do? If not, it’s a distraction. As a result, I would not recommend it to most people.

                    On what authority? I have no authority; I have only reason & experience. Just like anyone else on the planet.

                    1. 1

                      You concede you have no authority, yet you’re prescribing actions to people that you don’t share experiences with. Perhaps organizational systems have different purposes to different people. Perhaps the things you value in an organizational system aren’t necessarily the things everyone (or even most people) value in an organizational system.

          1. 8

            I’ve got a Nintendo Switch and Breath Of the Wild coming in the mail tomorrow. I’ll also be spending time with my family.

            Not many other plans outside of that.

            1. 1

              BoTW is a fucking amazing game. You’ll have a blast.

              My girlfriend has been watching me play, she legitimately gets excited just watching and always wants me to play. You could definitely make some family time out of it!

              1. 1

                I bought BoTW in December of last year. Through light play sessions, plus some longer ones, I’m about to finish the game.

                Of course I could have finished it earlier but I just didn’t want it to end. Nowadays I’ve almost run out of things to do in the game.

                It’s that good.

              1. 6

                Is it not a little ironic that this is a medium site?

                1. 8

                  Staying in a cabin in the Michigan backwoods. Weather is calling for a few rainy days, so likely I’ll be playing old SNES games on my Raspberry Pi :)

                  1. 2

                    Oh man that sounds so cozy. Extremely envious. Enjoy!!

                  1. 13

                    As a programmer with plenty of C experience I have two problems with this article. The first is that venn diagram. It implies that skilled programmers, for some measure of “skilled”, are not writing unsafe code. I thought everyone took it for granted that even the most skilled programmers will write segfaults. Certainly, even the most skilled programmers have shipped segfaults in the past.

                    I also take issue with the description of the experience of Rust as being “fighting the borrow checker”. Bear in mind here that while I enjoy Rust, I’m by no means an evangelist; bear in mind also that I’m also coming at this from a formal languages / programming language design standpoint. I think it’s common experience to have to go through several rounds of revision before passing the Rust compiler. What isn’t common, and what I don’t understand, is why people see that as fighting the compiler. To me, this is the mark of a fantastic compiler: the compiler is there to help me write correct code. When rustc yells at me 7 ways ‘till Sunday, I know I need to rethink my code. It’s taught me more than a few things about systems programming.

                    1. 4

                      Any example of a situation in which creating commits like this helps?

                      1. 3

                        Let’s say you have some complicated history pattern with merges and so on. Lots of different developers doing lots of different things. After a bunch of merges and merge conflict resolutions you have a history of sorts, but you want to clean it up. This allows you to make a single commit where the end result is the tree matches the complex history you’d like to throw away.

                        Very useful for keeping dev history clean.

                        1. 1

                          Ah, that makes sense. So like a squashed merge, but without the merge. I guess it’s what git merge --squash --strategy=theirs would do if that merge strategy existed.

                          1. 1

                            Well, now that I think about it, wouldn’t saying –strategy=theirs be specifying just how conflicts are handled? My tool is saying, forget about conflicts, merging, everything, take the entire tree from the other commit wholesale. Don’t even try and merge things together.

                            1. 1

                              No, that’s what --strategy=recursive -X theirs does. The existing “ours” strategy just throws away the other commit and takes the tree from the current one. A fictional “theirs” strategy would do the same with the other tree.

                              Merge strategies and their options are pretty confusing.

                          2. 1

                            Wait… you use it to delete history? But… having that history around is the reason I use git?

                            1. 1

                              The last thing I want to do when fighting a production fire at 3am is be sorting through 12 merges of commits that look like:

                              • add feature
                              • whoops
                              • small fix
                              • review comments
                              • doh maybe this time.

                              squash that crap together! What commit broke the build is infinitely harder to figure out when the problem is in some chain of merges titled “whoops”

                              I decidedly prefer having my git history serve as a neatly curated form of documentation about the evolution of the codebase, not chaos of immutable trial and error

                              1. 2

                                I constantly bring this up in pull requests when I see shitty commit histories like that. Squash your damn commits! If you’ve already pushed a branch, create a new one with a new name, pick your commits on top of it, rebase -i and squash them into succinct relevant feature sets (or try to get as close as you can).

                                I realize this is once that’s already gone and it’s too late (history with a ton of “squishme: interum commit” bullshit in there) and that’s the purpose of tools like yours, but teaching people good code hygiene is pretty important too. :-P

                                1. 1

                                  So I agree with you on this approach, but I think I’m still not grasping what your tool accomplishes. Couldn’t the situation you’re outlining here be accomplished by squashing?

                                  1. 1

                                    Yeah that last comment was really more of a discussion about why you might want to clean up git history. That’s a poor example for this tool.

                                    This tool is useful when there’s multiple merges along two divergent branches of history and you want to make a commit that essentially contains the entire diff from your commit down to the merge-base of another commit combined with the diff from the merge-base back up to that other commit.

                                    1. 1

                                      Hmm, I guess I just can’t picture in what kind of situation that would happen. Could you explain the example chronologically?

                                      1. 1

                                        I think @jtolds is on significantly more complicated code bases than I’ve worked on. There was an earlier post about Octopus commits:

                                        https://www.destroyallsoftware.com/blog/2017/the-biggest-and-weirdest-commits-in-linux-kernel-git-history

                                        and here is a visual for what that would look like:

                                        https://imgur.com/gallery/oiWeZmm

                          1. 8

                            What’s the use case here? Why marry these technologies? (I’m not criticizing; just confused)

                            1. 6

                              This is my one week at home between the end of my third year at UChicago and the start of my internship at Braintree. I’m spending a lot of time on my health: running to keep my body fit, snuggling with my puppo to keep my mind fit.

                              I’ve written a blog post about the basics of PLT. I have at least two more posts coming out this week that have been kicking around for a while. Stay tuned!

                              I’ve also spent time developing a hugo theme that suits my needs. I’m pretty happy with how it turned out! You can see it in action on my personal site.

                              I have a fun project in the works; it’s an interpreter for a silly language that was part of an incredible final-lecture game-day hackathon in my recent programming languages class. It can’t quite be made public yet, but I’m definitely going to write something up and share it as soon as possible.

                              I’m also culling through my dotfiles in anticipation of my coming internship. I recently spent a lot of time slimming them down to the extreme, just throwing out entire modules, in the name of minimalism. It’s been great. I want to continue slimming down and making my environment more visually consistent, as well as more focused. I’m endlessly frustrated by my shell: bash, zsh + oh-my-zsh, and fish all have their own quirks that bother me to no end. Per this commit in my dotfiles, I’m currently on “Revert “Revert “Revert “Revert “Revert “Revert “Move back to fish!”””””””. And that’s just the actual git reverts. If anyone has any suggestions for a clean, modern, minimal shell environment, I would really love to talk to you!

                              1. 2

                                I’m pretty happy with my current ZSH shell config. It uses antibody, so the config is pretty small with everything being pulled in from plugins (and I split the bits I did want from my old config out to plugins to make them reusable) and it’s not using any of the big frameworks like Oh My Zsh, or Prezto, so it’s fast compared to what I had before. If you’re interested, you can find it here.

                                1. 1

                                  Hey, so I finally got around to taking a look and I really like your setup. Can you elaborate a bit on some of your custom plugins? I can’t find any descriptions for these:

                                  haegin/zsh-magic-history
                                  haegin/zsh-magic-completion
                                  haegin/zsh-fzf
                                  haegin/zsh-asdf
                                  haegin/zsh-rationalise-dot
                                  
                                  1. 1

                                    Sure thing. I’ll work on adding some readmes to those repos over the next day or so.

                                    The shortest version is that they’re the bits of my shell config that I couldn’t find in existing plugins, but that’s probably not useful, so here’s a summary of each:

                                    zsh-fzf - fzf is a fuzzy finder I use. This just sets up the plugin. zsh-asdf - asdf is a programming language version manager with plugins for different languages. This sets it up in the shell. zsh-rationalise-dot - this plugin sets zsh up so when you type more than 2 dots (..) in a row, each dot after the second adds /... zsh-magic-history - sets up history settings that work across multiple shells, so you don’t need to open a new shell to access history from other shells. zsh-magic-completion - this just copies completion settings from the repo I originally copied my config from (https://git.madduck.net/etc/zsh.git). I can’t remember what exactly I found myself missing when I didn’t have this, but I copied it over pretty quickly and haven’t taken the time to go through it to work out if I want to change anything else.

                                    1. 1

                                      Thanks, that helps a lot!!

                                  2. 1

                                    Ooooh, this is really tantalizing. I like this a lot. Thank you very much for the link!!

                                1. 6

                                  I literally was so happy to see this post because (a) I’m glad to see this information being more widespread and (b) it’s exactly what I learned in my recent PL class.

                                  You might imagine my surprise that it turned out to be my recent PL class… Hi Mark! (It’s Charles)

                                  1. 4

                                    Haha, hey Charles! CS221 for life :)

                                    P.S. any interest in hacking on a monadic SNAPE? DM me if so!

                                  1. 4

                                    Minor adjustment: what was written here is mostly an interpreter. It’s probably worth noting the idea of a compiler targeting some other language (possibly a machine language). The idea of comparative linguistics and translation is important to introduce in any intro to PLT writeup.

                                    1. 2

                                      Good call. When actually writing interpreters (for example, the majority of my PL class), the two terms often get conflated.

                                    1. 22

                                      just hope you don’t have to do any string manipulation :)

                                      1. 13

                                        This. I have a good amount of experience writing C code and maintaining larger C applications, and C can be a real pain to deal with. Not to mention that it exposes a whole host of nasty security vulnerabilities. Finally, it seems a bit too low-level for these kinds of applications. I’m very confused by the choice of C here.

                                        1. 3

                                          I’m guessing it’s because C is the main API for SQLite? I do I agree that C is an interesting choice here, maybe something more like Lua?

                                        2. 4

                                          I agree. Writing secure C is hard. Sure, you can pledge your way out of it, but that doesn’t help if sensitive data is stolen. But what would be a reasonable alternative? Rust is probably too complex a language for the taste of OpenBSDers. Go?

                                          1. 2

                                            you can pledge your way out of it,

                                            You can’t. Their kernel and firmware still processes network-facing data. It might still do damage. How much is an unknown until the setup gets the kind of rigorous pentesting we see on Windows, Chrome, the SFI schemes, and recently x86 CPU’s. It does have a nice security by obscurity benefit on top of methods that provably increase work for attackers.

                                          2. 1

                                            There’s no string manipulation in HTTP servers, right?

                                            Right?

                                          1. 10

                                            By this point, you might be thinking that the obvious solution is to just disable push notifications entirely.

                                            After a few days, I realized that my brain had become so accustomed to my phone telling me what I needed to attend to, that I felt lost when I didn’t have those cues.

                                            How long did you try this for? I’ve completely disabled push notifications on my computer for a few months, and I think over time I’ve ended up compulsively opening email/slack/etc. less. What was important was not just removing the notifications, but other visual cues (for example, having my dock always visible on macOS, which would display little red icons). On the other hand, I think I would have little success if I tried to do this on my phone, so I don’t. I view my phone as less of a working tool anyways, so I’m okay with this. Most importantly, when I’m trying to focus I can reasonably restrict my access to my phone, but less so with my computer.

                                            I’ve personally struggled more with the idea that Something Very Important could have happened since I last checked in. The set of things that trigger this are much smaller, but they exist enough to be a problem at least every few days. For example, when I’m anticipating a results of an exam that I don’t think went particularly well, I tend to open email and check every time my mind drifts. I don’t think consuming content purely in digest form would fix this. Perhaps aggressive filtering would work, but I haven’t tried this and am generally suspicious of “productivity/mindfulness solutions” that require lots of active effort.

                                            1. 2

                                              I only tried it for about five days. Perhaps a longer experiment is in order. I’ve also done a lot of visual decluttering on my computer, e.g. removing my bar, notifications, etc.

                                              1. 3

                                                I can attest that both a minimal computing environment and disabling notifications have helped me transition out of a time when I was feeling similar to how you’ve described.

                                                1. 3

                                                  This is really reassuring to hear, thank you :)

                                            1. 2

                                              I feel this pretty much miss the point of just silencing your phone and using it when you actually need it. Push notifications are made to save you from checking all your apps where new content is there but you don’t want to open them everyday 1 by 1.

                                              If you want to save yourself from the trend, don’t deactivate push notification, just let your phone at home while going to work, or let it in another room, in you bag, whatever. The issue is not the push notification itself, but your addiction to new content.

                                              1. 1

                                                Of course, that’s easier said than done. What happens when my girlfriend sends me an urgent message but I don’t see it because my phone is in my backpack/at home/whatever else? That’s what I mean by the “culture” of push notifications - there’s an expectation that you’re available/able to be reached.

                                                All that said, I do like the idea. All of these comments have really got me thinking about potential solutions. I think a follow-up post is in order.

                                                1. 1

                                                  Trash that culture. In my “culture”, I can’t bring my phone into my work building. The phone is off from about 6a until I remember to turn it back on, maybe 6p. You could probably do something similar without being fully off.

                                                  In my culture, I don’t even want to figure out how to set up voicemail, and I don’t care. If don knuth is allowed to not have email, I’m allowed to not have voicemail. I hate voicemail. Texting is the way

                                                  1. 1

                                                    I have only voicemail (delivered to my chat client as both listenable audio and machine-transcribed text) so that I can have my phone never ring but still know if anyone tries to call me about something (and text them back)

                                                  2. 1

                                                    quoting my other comment https://lobste.rs/s/gmdgnf/push_notifications_considered_harmful#c_bljj0c

                                                    On iphone (I don’t know for other platforms) you have a DND mode with “favorites” that can still notify you. I’ve been on-call several time and just setting SMS/Phone Call on first method of contact on pager duty + using this DND mode was enough for me to let my phone upside down the whole day and still be notified when I needed to be.

                                                1. 8

                                                  TL;DR: Get off my lawn, punk.

                                                  In terms of the history of technology, my childhood was marked by … complete and total tech-illiteracy on the part of the previous generation

                                                  Seriously? That’s a rather broad generalization, and as a techie staring down his fortieth birthday I can’t help but resent it just a little. I remember seeing push notifications touted as a “new feature” on the first iPhone and remembering how much push technology sucked back in the mid-1990s.

                                                  The whole reason we came up with pull technologies for Web news and blogs like RSS and Atom was because Microsoft tried shit like Channel Definition Format during the First Browser War (IE vs Netscape), it sucked big floppy donkey dicks, and we didn’t want a bunch of shit-faced corporate cockmasters turning the Web into the Second Coming of Cable TV.

                                                  Apple wasn’t doing anything that [PointCast](https://en.wikipedia.org/wiki/PointCast_(dotcom\)) hadn’t already tried, but everybody thought push was revolutionary in part because tech journalists make my cats look like Nobel laureates and partly because of Steve Jobs’ reality distortion field.

                                                  It’s the idea that app developers have the ability to grab my attention as they wish, which of course we enthusiastically welcomed into our lives as one of the chief innovations of the iPhone age.

                                                  Speak for yourself. I only bother with smartphones for my convenience. Everybody else can go hang, and my friends, family, and coworkers know damned well that if they want synchronous communication with me they’d better talk to me in person, because I won’t talk on the phone and I will only reply to emails and texts when it’s convenient for me to do so – unless it’s an email/text from my wife.

                                                  Whenever I got a new phone (I’m on my third), the first thing I do after installing apps is duct-taping their mouths shut so that they can’t try to grab my attention with push notifications. I don’t answer to app developers, and I won’t tolerate tech that does not serve me.

                                                  Using a bullet journal is a great idea if it works for you, but I think a deeper attitude adjustment is in order. You might benefit from being more egoistic and demanding that tech serve you, rather than you serving tech. Do not yield to the machine. Bend the machine to your will, and break any machine that will not yield.

                                                  1. 4

                                                    I think a bigger attitude adjustment is in order.

                                                    Yeah, I agree. I envy your “bend the machine to your will” attitude and I wish I could just snap my fingers and become that. You’re probably thinking “well why can’t you?” - I, and a lot of others in my generation, have a lot more unlearning to do.

                                                    Lastly, yes, of course there are many extremely tech-literate people in the prior generation - they created what everyone uses today, and I take classes from a lot of them. I suppose I should’ve worded that better. Rather what I was trying to express was that as I was growing up, it seemed like none of the adults in my life (or my friends’ lives) knew what the hell an iPod was, how the internet worked, or anything like that. We felt very much on our own to navigate the wave of new tech.

                                                    1. 2

                                                      I don’t expect you to assert mastery over the machine overnight. I grew up with bigger, less powerful computers than you did, and I’m used to thinking of computers as machines that do exactly what you tell them to do really goddamn fast. I still regard digital assistants like Siri, Cortana, Google’s “Little Nag”, etc as glorified Eliza implementations. Without a shitload of data to draw upon, they’re nothing.

                                                      Rather what I was trying to express was that as I was growing up, it seemed like none of the adults in my life (or my friends’ lives) knew what the hell an iPod was, how the internet worked, or anything like that.

                                                      None of the adults in my life knew much about computers, either. Hell, I didn’t get my first general-purpose computer until I was 18, in 1996. I had to buy the demon-ridden thing myself, and the only software it had was IBM PC-DOS 6. I was on my own, too, but I was used to being on my own. I didn’t have “helicopter parents”.

                                                  1. 17

                                                    Considering harmful considered harmful.

                                                      1. 2

                                                        Yes lol this was 100% tongue-in-cheek

                                                      1. 9
                                                        Google embraces, extends, and extinguishes

                                                        Published 2018-05-03 on Drew DeVault’s blog

                                                        One day later…

                                                        2018-05-04 18:12 UTC: I retract my criticism of Google’s open source portfolio as a whole, and acknowledge their positive impact on many projects. However, of the projects explicitly mentioned I maintain that my criticism is valid.

                                                        Now… this is scary.

                                                        1. 6

                                                          Author here, emphasis yours. Why is this scary? I was privately shown many counterexamples of Google being a good actor in open source after publishing this post. This does not excuse the rest of their behavior.

                                                          1. 4

                                                            I’m not the author of the above comment, but I think they share my view that in light of the rapid retraction, the tone of the post comes across as rather overconfident. I’m not sure why they chose the word “scary”, but something does seem off about making such a wide blanket statement evidently without having done the requisite research.

                                                            1. 7

                                                              No I just felt smell of lawyers…

                                                              1. 1

                                                                I wrote of Google’s open source from my own experiences, not from research. I admit I should have researched it more, which is why I wrote the retraction. Anyway, I got some confusion from other sources as well so I published another update:

                                                                Apparently the previous retraction caused some confusion. I am only retracting the insinuation that Google isn’t a good actor in open source, namely the first sentence of paragraph 6. The rest of the article has not been retracted.

                                                              2. 2

                                                                I still think it’s a valid criticism. Google’s open source seems to fall into three categories: Projects that exist to drive demand for their core business, and erect a barrier for competitors (Chrome, Android, …), Projects that exist to support the former category, and things that are harmless to the business, but keep engineers happy.

                                                                Google is big enough that it’s easy for them to embrace one strategy for some projects, and another for others.

                                                                Full disclosure: I’m an ex-googler, with a decent amount of discomfort about the direction that the web (and, more generally, tech) seems to be taking.

                                                                1. 2

                                                                  I definitely agree as far as Google’s own projects are concerned. What was pointed out to me is their substantial and quiet contributions to other projects.

                                                                2. 1

                                                                  Sorry… having saw what these companies can do, I felt smell of lawyers.
                                                                  As Facebook have shown everybody in early CA days, they care about free speech just when what is said conforms to their interests.

                                                                  I completely agree with your article, btw.

                                                                  Google (or Microsoft or Apple or Facebook or…) playing as a good actor sometimes does not means they do not embraces, extends and extinguishes.

                                                                  It’s just a matter of what is in their current interests and long term goals.
                                                                  It’s a marketing tool, after all: to keep it effective, they must play as the good guys most of times.

                                                                  However I’d like to read about the counter examples: I already had noticed the trend you describe in the article and got the same conclusions.
                                                                  Maybe I could stand corrected as you were.

                                                                  1. 1

                                                                    I wrote another update which may clarify:

                                                                    Apparently the previous retraction caused some confusion. I am only retracting the insinuation that Google isn’t a good actor in open source, namely the first sentence of paragraph 6. The rest of the article has not been retracted.

                                                              1. 9

                                                                Benjamin C. Pierce, Types and Programming Languages, MIT Press.

                                                                That’s the one you want. I’m biased towards ML (vs Haskell), and I think the book is, too (it’s not a Haskell book). You can get all six, sure, but if you had to get one that’s the one.

                                                                1. 3

                                                                  Software Foundations is also good, and online for free.

                                                                  1. 3

                                                                    +1 for this. I’m using TaPL in my PL class this quarter and it’s awesome. Super well written and ML is great for this class - the work involves writing successively more complex interpreters for successively more complex toy languages. We’re not sticking strictly to the book, but the sections our prof has pointed us to have been great.

                                                                    1. 1

                                                                      I also highly recommend TAPL.

                                                                      I’ve been recommended TAPL before, but seeing as this isnt a class thats strictly about type systems, I’d like to get a more general one and read TAPL later.

                                                                      TAPL isn’t just about types neither - it’s types AND programming languages.

                                                                      Practical Foundations for Programming Languages is also very good.

                                                                      1. 1

                                                                        +1 for PFPL. It covers more material in fewer pages than TaPL, and it’s more up to date.

                                                                      2. 1

                                                                        There are lots of examples in this book, which I have found very helpful.

                                                                      1. 6

                                                                        Just putting in a plug for Bitwarden. I’m not affiliated with them in any way, but I switched from lastpass and have been very happy. It’s lastpass-like functionality with (IMO) a better interface, and built-in 2FA for the premium version. Compatible with Android autofill. Plus it’s open source!

                                                                        1. 2