1. 5

    The comment on how Swift make prototyping harder by forcing developers to express correct types is spot-on, and would apply to other strongly typed languages. One could argue that you should solve the problem on paper first and sketch out the types before writing the implementation, but I find it a good example of how dynamic languages shift our expectations in terms of programming ergonomics.

    1. 20

      I’d be very curious to hear what situations you’ve encountered where you were prototyping a solution that you understood well enough to turn into code, but not precisely enough to know its types? I’ve personally found that I can’t write a single line of code – in any language, static or dynamic – without first answering basic questions for myself about what kinds of data will be flowing through it. What questions do you find the language is forcing you answer up-front that you would otherwise be able to defer?

      1. 7

        When I have no idea where I’m going I sometimes just start writing some part of the code I can already foresee, but with no clue how anything around it (or even that part itself) will end up looking in the final analysis. I have no data structures and overall no control flow in mind, only a vague idea of what the point of the code is.

        Then with lax checking it’s much easier to get to where I can run the code – even though only a fraction of it even does anything at all. E.g. I might have some function calls where half the parameters are missing because I didn’t write the code to compute those values yet, but it doesn’t matter: either that part of the code doesn’t even run, or it does but I only care about what happens before execution gets to the point of crashing. Because I want to run the stuff I already have so I can test hypotheses.

        In several contemporary dynamic languages, I don’t have to spend any time stubbing out missing bits like that because the compiler will just let things like that fly. I don’t need the compiler telling me that that code is broken… I already know that. I mean I haven’t even written it yet, how could it be right.

        And then I discover what it is that I even wanted to do in the first place as I try to fill in the parts that I discover are missing as I try to fill in the parts that I discover are missing as I try to fill in the parts that I discover are missing… etc. Structures turn out to repeat as the code grows, or bits need to cross-connect, so I discover abstractions suggesting themselves, and I gradually learn what the code wants to look like.

        The more coherent the code has to be to compile, the more time I have to spend stubbing out dummy parts for pieces of the code I don’t even yet know will end up being part of the final structure of the code or not.

        It would of course be exceedingly helpful to be able to say “now check this whole thing for coherence please” at the end of the process. But along the way it’s a serious hindrance.

        (This is not a design process to use for everything. It’s bottom-up to the extreme. It’s great for breaking into new terrain though… at least for me. I’m terrible at top-downing my way into things I don’t already understand.)

        1. 4

          That’s very interesting! If I’ve understood you correctly, your prototyping approach seems to allow you to smoothly transform non-executable sketches into executable programs, by using the same syntax for both. So instead of sketching ideas for your program on a napkin, or on a whiteboard, or in a scratch plaintext file, you can do that exploration using a notation which is both familiar to you and easy to adapt into an actual running program. Would it be correct to say that by the time you actually run a piece of code, you have a relatively clear idea of what types of data are flowing through it, or at least the parts of it that are actually operational? And that the parts of your program whose types you’re less confident about are also the parts you aren’t quite ready to execute yet?

          If so, then I think our processes are actually quite similar. I mainly program in languages with very strict type systems, but when I first try to solve a problem I often start with a handwritten sketch or plaintext pseudocode. Now that I think about it, I realize that I often subconsciously try to keep the notation of those sketches as close as possible to what the eventual executable code might look like, so that I’ll be able to easily adapt it when the time comes. But either way, we’re both bypassing any kind of correctness checking until we actually know what it is we’re doing, and only once we reach a certain level of confidence do we actually run or (if the language supports it) typecheck our solution.

          Let me know if I’ve missed something about your process, but I think I understand the idea of using dynamic languages for prototyping much more clearly now. What always confused me is that the runtime semantics and static types (whether automatically checked or not) of a program seem so tightly coupled that it would be nearly impossible to figure one out without the other, but you seem to be suggesting that when you’re not sure about the types in a section of your program, you’re probably not sure about it’s exact runtime semantics either, and you’re keeping it around as more of a working outline than an actual program to be immediately run. So even in that early phase, types and semantics are still “coupled,” but only in the sense that they’re both incomplete!

          1. 3

            If I’ve understood you correctly, your prototyping approach seems to allow you to smoothly transform non-executable sketches into executable programs, by using the same syntax for both.

            Yup.

            Would it be correct to say that by the time you actually run a piece of code, you have a relatively clear idea of what types of data are flowing through it, or at least the parts of it that are actually operational?

            Well… it depends. For the parts that are most fully written out, yes. For the parts that aren’t, no. Neither of which are relevant when it comes to type checking, of course. But at the margins there is this grey area where I have some data structures but I only know half of what they look like. And at least one or two of them shift shape completely as the code solidifies and I discover the actual access patterns.

            If so, then I think our processes are actually quite similar.

            Sounds like it. I’d wonder if the different ergonomics don’t still lead to rather different focus in execution (what to flesh out first etc.) so that dynamic vs static still has a defining impact on the outcome. But it sure sounds like there is a deep equivalence, at least on one level.

            Now that I think about it, I realize that I often subconsciously try to keep the notation of those sketches as close as possible to what the eventual executable code might look like

            Seems natural, no? 😊 The code is ultimately what you’re trying to get to, so it makes sense to keep the eventual translation distance small from the get-go.

            So even in that early phase, types and semantics are still “coupled,” but only in the sense that they’re both incomplete!

            I had never thought about it this way, but that sounds right to me as well.

        2. 4

          You didn’t ask me but I’ll answer anyway because I’d like your advice! I am currently prototyping a data processing pipeline. Raw sensor data comes in at one end then is processed by a number of different functions, each of which annotates the data with its results, before emitting the final blob of data plus annotations to the rest of the system. As a concrete example, if the sensor data were an image, one of the annotations might be bounding boxes around objects detected in the image, another might be some statistics, etc.

          At this stage in the design, we don’t know what all the stages in the pipeline will need to be. We would like to be able to insert new functions at any stage in the pipeline. We would also like to be able to rearrange the stages. Maybe we will reuse some of these functions in other pipelines too.

          One way to program this is the “just use a map” style promoted by Clojure. Here every function takes a map, adds its results to the map as new fields, then passes on the map to the next function. So each function will accept data that it doesn’t recognize and just pass it on. This makes everything nicely composable and permits the easy refactoring we want.

          How would this work in a statically typed system? If the pipeline consists of three functions A, B then C, doesn’t B have to be typed such that it only accepts the output of A and produces the input of C? What happens when we add another function between B and C? Or switch the order so A comes last?

          What would the types look like anyway? Each function needs to output its input plus a bit more: in an OOP language, this quickly becomes a mess of nested objects. Can Haskell do better?

          Since I cannot actually use Clojure for this project, I’d welcome any advice on doing this in a statically typed language!

          1. 3

            In my experience statically typed languages are generally very good at expressing these kinds of systems. Very often, you can express composable pipelines without any purpose-built framework at all, just using ordinary functions! You can write your entire pipeline as a function calling out to many sub-functions, passing just the relevant resources through each function’s arguments and return values. This approach requires you to explicitly specify your pipeline’s dependency graph, which in my experience is actually extremely valuable because it allows you to understand the structure of your program at a glance. The simplicity of this approach makes it easy to maintain and guarantees perfect type safety.

            That said, based on your response to @danidiaz, it sounds like you might be doing heavier data processing than a single thread running on a single machine will be able to handle? In that case, depending on the exact kind of processing you’re doing, it’s still possible that you can implement some lightweight parallelism at the function call level without departing too much from modeling your pipeline as an ordinary sequence of function calls. Ordinary (pure) functions are also highly reusable and don’t impose any strong architectural constraints on your system, so you can always scale to a more heavily multi-threaded or distributed environment later without having to re-implement your individual pipeline stages.

            If you do have to run your system across multiple processes or even multiple machines, then it is definitely harder to express a solution in a type-safe way. Most type systems don’t currently work very well across process or machine boundaries, and a large part of this difficulty stems from that it is inherently challenging to statically verify the coherence of a system whose constituent components might be independently recompiled and replaced while the system is running. I’m not sure how your idiomatic Clojure solution would cope with this scenario either, though, so I’d be curious to learn more about exactly what the requirements of this system are. These kinds of questions often turn out to be highly dependent on subtle details, so I’d be interested to hear more about your problem domain.

            1. 2

              You can write your entire pipeline as a function calling out to many sub-functions, passing just the relevant resources through each function’s arguments and return values.

              That’s basically what Cleanroom does it its “box structures” that decompose into more concrete boxes. Just functional decomposition. It has semi-formal specifications to go with it plus a limited set of human-verifiable, control-flow primitives. The result is getting things right is a lot easier.

              1. 1

                Thank you. Just to emphasize, we are talking about prototyping here. The system I am building is being built to explore possibilities, to find out what the final system should look like. By the time we build the final system, we will have much stricter requirements.

                I am working on an embedded system. We have limited processing capability on the device itself. We’d like to do as much processing as we can close to the sensors but, we think, we will probably need to off load some of the work to remote systems (e.g. the “cloud”). We also haven’t fixed precisely what on-board processing capability we will have. Maybe it will turn out to be more cost-effective to have a slightly more powerful on-board processor, or maybe it will be helpful to have two independent processors, or maybe lots of really cheap processors, or maybe we should off-load almost everything. I work in upstream research so nothing is set in stone yet.

                Furthermore, we don’t know precisely what processing we will need to do in order to achieve our goals. Sorry for being vague about “processing” and “goals” here but I can’t tell you exactly what we’re trying to do. I need to be able pull apart our data processing pipeline, rearrange stages, add stages, remove stages, etc.

                We aren’t using Clojure. I just happen to have been binge watching Rich Hickey videos recently and some of his examples struck a chord with me. We are using C++, which I am finding extremely tedious. Mind you, I’ve been finding C++ tedious for about twenty years now :)

              2. 2

                Here every function takes a map, adds its results to the map as new fields, then passes on the map to the next function.

                Naive question: why should functions bother with returning the original map? Why not return only their own results? Could not the original map be kept as a reference somewhere, say, in a let binding?

                1. 4

                  If your functions pass through information they don’t recognize - i.e. accept a map and return the same map but with additional fields - then what is to be done is completely decoupled from where it is done. You can trivially move part of the pipeline to a different thread, process or across a network to a different machine.

                  You’re absolutely right though, if everything is in a single thread then you can achieve the same thing by adding results to a local scope.

                  At the prototyping stage, I think it’s helpful not to commit too early to a particular thread/process/node design.

            2. 6

              I may be too far removed from my time with dynlangs but I’ve always liked just changing a type and being able to very rapidly find all places it matters when things stop compiling and get highlighted in my editor.

              1. 5

                The comment on how Swift make prototyping harder by forcing developers to express correct types is spot-on, and would apply to other strongly typed languages

                Quick bit of notation: “strongly typed” is a subjective term. Generally people use it to mean “statically typed with no implicit type coercion”, but that’s not universal. People often refer to both C and Python as strongly typed, despite one having implicit coercion and the other not having static types.

                1. 1

                  Thanks for the clarification!

              1. 36

                Then again, I’ve rarely seen anyone use their editor of choice well. I’ve lost count of how many times I’ve watched someone open a file in vim, realise it’s not the one they want, close vim, open another file, close it again… aaarrrgh.

                I do this a lot, because I prefer browsing files in the shell. I make pretty extensive use of a lot of other vim features though. When did you become the arbiter of how “well” I’m using my computer?

                1. 3

                  Closing vim seems odd to me. Why wouldn’t one instead open the new file without closing vim? Maybe it’s a cultural thing? I don’t think anyone would do that in Emacs.

                  1. 27

                    “Why would I ever leave my editor” definitely feels like a common refrain from the Emacs crowd.

                    1. 1

                      I do the thing you quoted as well, but that is because vim is often my editor of convenience on a machine rather than my editor of choice, which is true for many usages I see of vim.

                    2. 22

                      Because the shell lets me change directories, list files with globs, run find, has better tab-completion (bash, anyway), etc, etc. I might not remember the exact name of the file, etc. Finding files in the shell is something I do all day, so I’m fast at it. Best tool for the job and all that.

                      (Yes I can do all that with ! in vi/vim/whatever, but there’s a cognitive burden since that’s not how I “normally” run those commands. Rather than do it, mess it up because I forgot ! in front or whatever, do it again, etc, I can just do it how I know it’ll work the first time.)

                      1. 6

                        This is exactly why I struggle with editors like Emacs. My workflow is definitely oriented around the shell. The editor is just another tool among many. I want to use it just like I use all my other tools. I can’t get on with the Emacs workflow, where the editor is some special place that stays open. I open and close my editor many, many times every day. To my mind, keeping your editor open is the strange thing!

                        1. 3

                          It’s rather simple actually: the relationship between the editor and the shell is turned on it’s head – from within the editor you open a shell (eg. eshell, ansi-term, shell, …) and use it for as long as you need it, just like a one would use vi from a shell. Ninja-slices.

                          You can compare this as someone who claims to log out of their x session every time they close a terminal or a shell in a multiplexer. Would seem wierd too.

                          1. 3

                            I know you can launch a shell from within your editor. I just never really understood why you would want to do that.

                            Obviously some people do like to do that. My point is just that different ways of using a computer make intuitive sense to different people. I don’t think you can justify calling one way wrong just because it seems odd to you.

                            1. 6

                              I know you can launch a shell from within your editor. I just never really understood why you would want to do that.

                              I do it because it allows me to use my editor’s features to:

                              a) edit commands b) manipulate the output of commands in another buffer (and/or use shell pipelines to prep the output buffer) c) not have to context switch to a different window, shutdown the editor, suspend the editor, or otherwise change how I interact with the currently focused window.

                              1. 1

                                That makes a lot of sense. I guess I have been misleading in using the word “shell” when I should really have said “terminal emulator”. I often fire off shell commands from within my editor, for just the same reasons as you, but I don’t run an interactive shell. I like M-! but I don’t like eshell, does that make sense?

                                Having pondered this all a bit more, I think it comes down to what you consider to be a place. I’m pretty certain I read about places versus tools here on lobsters but I can’t find it now. These are probably tendencies rather than absolutes, but I think there are at least a couple of different ways of thinking about interaction with a computer. Some people think of applications as places: you start up a number of applications, they persist for the length of your computing session, and you switch between them for different tasks (maybe a text editor, a web browser and an e-mail client, or something). Alternatively, applications are just tools that you pick up and drop as you need them. For me, a terminal, i.e. an interactive shell session, is a place. It is the only long-lived application on my desktop, everything else is ephemeral: I start it to accomplish some task then immediately kill it.

                          2. 3

                            It’s really simple in emacs. Just Ctrl-z and run fg when you are ready to go back.

                      1. 6

                        I think it’s worth splitting hairs on another dimension of remote:

                        Some companies allow remote, but you have to “remote desktop in”. I often work for one of those, since apparently it makes some kind of banking contracts easier/simpler. I hate that part, since it’s hard to be effective on a plane or on a train, but since my “office” is in Ireland and I live in London, at least the online latency isn’t that bad.

                        Other companies are “remote” but allow you/expect you to work in your own environment (or in a cloud/container environment). This latter is much easier to be “remote”, but leaves you more at the mercy of the worst IT person in the world (yourself).

                        1. 4

                          … leaves you more at the mercy of the worst IT person in the world (yourself).

                          If you’re the worst IT person you’ve had to deal with, you are very lucky!

                          1. 1

                            A malapropism perhaps. Probably just drink. I meant a jab at companies that require Developers to do IT and Operations tasks.

                            I’d prefer IT set things up so that I’m not blocked. I hate playing whack-a-mole with technical services to get ports unblocked.

                            1. 2

                              Oh, I know what you mean. I’m just suffering with IT at my current job. I’m not allowed to set anything up myself but it takes them months - literally months - to spin a up single VM. And that’s after weeks of form filling and discussion to kick off the process. As a result, everyone does their best to avoid IT, so we all have incompatible systems running on machines we bought on the company credit card and hid under our desks.

                              1. 1

                                We’re slightly better than that: Cloud Change is on Wednesdays, and Network Requests get done over the weekend. And (thankfully) not all projects need to go through this process; For the most part, if you write the ticket “correctly” you’re fine, but “correctness” still feels like a moving target at times. I’d much rather them just know enough to sort me out so I can start doing the things I know how to do…

                          2. 3

                            What do you mean by “remote desktop in”? Like, you need a stable connection, or need to work in the same place every time (like your own home office)? Regarding your last topic, ideally, if your company really wants to allow remote, the IT part of it shouldn’t be a pain to setup (VPN would be a standard), if it is, I’d question the motivations to allow it in the first place. There are some businesses though (like banks) where IT setup is very strict.

                            1. 3

                              What do you mean by “remote desktop in”?

                              I mean RDP or PCoIP. (The company I’m with now: it’s RDP)

                              if your company really wants to allow remote, the IT part of it shouldn’t be a pain to setup (VPN would be a standard), if it is, I’d question the motivations to allow it in the first place.

                              The company lets me live where I live because I want to live there. It’s a “remote friendly” situation, but the client still has their requirements on the company and we can’t do anything about that.

                            2. 2

                              I have never heard of this. I assume you mean something different to “I need access to the VPN to connect to a staging database?”. What difference does supposedly it make whether you’re “remote desktop in” or working on your laptop? The same code gets written either way. Is it a compliance thing?

                              1. 4

                                This is often done for compliance reasons, or at least for client reassurance where financial data is handled.

                                Staff are given very locked-down desktop computers and work is performed from those workstations. If you work from home you must use SSH, RDP or equivalent to connect to and work on your PC.

                                In many cases private data should be airgapped from developer workstations anyway, but it’s another layer of protection against accidental leakage. It also means you never have to have the “somebody left their laptop on the train” conversation with an auditor.

                                1. 3

                                  Yes, it’s a compliance thing. There needs to be a complete and documented chain of custody from the contents of my brain to the customer. No stack overflow or third-party code. All access needs to be secure and documented.

                                  I have a remote terminal I can access using one of these. From there, I’m allowed to write code and interact with either the dev or preqa environments.

                                  The alternative is that I go into an office with a PC set up exactly like may terminal.

                                  In either case, I can use a VPN and a different token to reach the UAT (but I cannot reach its database, etc., since it often contains customer data). Any screens I look at there are logged.

                              1. 1

                                Suggesting that Haskell has no null is doubtful. A diverging computation, e.g. null = 1 + null is typable for, say Integers, but admits no value. So, there you go: another bottom value that fits in every type.

                                1. 6

                                  The nice thing about bottom, compared to null, is that it’s not observable. In other words, we can’t do something like:

                                  myValue = if isBottom myOtherValue
                                               then thingA
                                               else thingB
                                  

                                  In this sense, bottom acts more like a thrown exception (control flow) than a null (data value); although it looks like a null since laziness combines data flow with control flow.

                                  In a sense, this more faithfully represents an “unknown” value, since attempting to figure out which value it is also ends up “unknown”. In contrast, null values are distinct from other values. For example, if I don’t know the value of a particular int, the answer to “is it 42?” should be “I don’t know”, not “no”. Three value logic attempts to act like this, but is opt-in.

                                  1. 1

                                    Please could you explain how “laziness combines data flow with control flow”?

                                    1. 2

                                      Just the idea that evaluation proceeds based on the definition of data, rather than separate control mechanisms, e.g. we can write ifThenElse as a normal function:

                                      ifThenElse True  x y = x
                                      ifThenElse False x y = y
                                      
                                      1. 2

                                        Oh, I see. Thanks. I was thinking that the usual C-style control mechanisms, e.g. if and for, still kind of entangle control flow and data flow, albeit with special syntax rather than just functions. I wonder if it is possible to disentangle this? What would that look like?

                                1. 7

                                  This whole “adblocker selling ad views” cluster fuck is why I like Apple/Safari’s approach.

                                  If you have to worry about how much memory each adblocker uses, and which ads they whitelist or whether they sell your private browsing data, you’ve already lost.

                                  1. 3

                                    What is Apple/Safari’s approach? How does it differ from Firefox extensions?

                                    1. 7

                                      As @geocar says: safari content blockers are basically JSON arrays of rules: block URL, whitelist URL, hide Element (using CSS selectors) or recently, force HTTPS for URL.

                                      The app provides this JSON (either from a static file in it’s app bundle, or a generated list via app options) to Safari, and Safari itself does the blocking.

                                      The blocker knows nothing about what you visit, you can combine content blockers, etc.

                                      While a content-blocker using app could have it’s own “approved ads” that it doesn’t block, theres no longer any issue about “Blocker X is the most memory efficient but it also allows Ads from CrappyCorp”, because the blocking is all done by Safari itself, so the content blockers are on an even playing field in terms of performance/features of what can be blocked/hidden. While there are some inefficient ways to write Content Blocker rules, Apple has pretty good docs about how to write good rules (i.e. mostly its about writing optimised RegEx queries to match domains/paths).

                                      Apps like 1Blocker also allow user-written custom rules (using the same basic syntax as raw Content Blocker rule sets) so you can customise what you block, using the same performance advice from Apple’s docs.

                                      1. 3

                                        What are some Safari (for macOS) extensions that use the Content Blocker API? The only one I found that was sort of usable was AdGuard, but I’d like to try something else.

                                        1. 2

                                          I use 1blocker on both ios and macOS. With iCloud syncing and custom rule sets it’s pretty great.

                                          (Not affiliated at all with 1blocker developer)

                                          1. 1

                                            Thanks, I’ll try it out.

                                      2. 4

                                        Safari Content Blockers aren’t allowed to inject scripts into your page, or otherwise track how many (or which) pages you visit.

                                      3. 3

                                        IE actually did this model - it had “tracking protection lists” that the browser itself applied. EasyList and others were translated to that format; and the browser did the blocking itself. (Unfortunately, they didn’t add that to Edge, but it at least supports WebExtensions to use a “normal” adblocker…)

                                      1. 2

                                        When I read the title I thought you were looking for languages that were designed for remote work, but on opening the question I saw you are looking for languages that are in demand for remote work …

                                        I actually think that the former question is more interesting. What would a language look like, if it was designed specifically to address remote work?

                                        And to answer your question, I was working two years in remote mode, for a team that was around 600 km away from me. We used Python almost exclusively, but it was not web development: it was a backend service for a mobile client. I love Python very much, but that experience showed me that using it in a distributed team requires a lot of discipline and a lot of code conventions. It is not easy to convey complex requirements over a phone line.

                                        1. 1

                                          You’re right, that would be a more interesting question. Slightly less practical for my present need though :)

                                        1. 5

                                          Working remote requires trust. Trust can be built by long-term commitment, real interest and care for your (langage) community. Trust is often transitive: people there can recommend you so that’s easier for you to work remotely. Try to get closer to people who have talent : don’t pretend you’re interested if you’re not, don’t try to seduce them. Don’t try to be the brilliant jerk. Get better. Help people. Don’t pretend to be someone else, try to focus on what you like most, and learn to like what you need. Choose to get closer to good team players, avoid your local brilliant jerk. Pair program with them on open source projects. Add value. Target exotic yet super efficient functional languages, i.e. Elm if you’re focusing on web technologies. Be pragmatic. Once you’re rewarded by trust and perhaps a remote position, stay with them, take care of newbies. As a bonus : such a community also helps a lot on the social side of working remotely - that’s not easy for everyone.

                                          1. 2

                                            Trust can be built by long-term commitment, real interest and care for your (langage) community.

                                            That’s a really interesting point, thank you. I don’t think I’ve ever really been involved in a language community since I stopped using Perl, some years ago. I don’t see much community in my current areas.

                                            Don’t pretend to be someone else, try to focus on what you like most, and learn to like what you need.

                                            I’m good at the first two - that’s how I’ve ended up where I am. Now it sounds like I’ll have to learn to like something different. That isn’t necessarily bad though, different can be good.

                                            Target exotic yet super efficient functional languages, i.e. Elm if you’re focusing on web technologies.

                                            I would love to do that. I worry that if I target the exotic, I reduce my job opportunities too much. Perhaps this worry is unfounded.

                                            1. 2

                                              I worry that if I target the exotic, I reduce my job opportunities too much. Perhaps this worry is unfounded.

                                              I think it cuts both ways. There are fewer jobs in “exotic” languages, but that also usually means fewer (or no) local experienced candidates (especially for employers outside of Silicon Valley), so companies are forced to be a little more creative. If you’re writing Java or Ruby, it’s harder to stand out from the local talent pool. Also, I suspect employers who are more willing to try exotic languages are also more willing to try exotic working arrangements like distributed teams.

                                              1. 1

                                                Another way to state “learn to like what you need” is “take care of yourself”. I don’t think that’s optional. :)

                                                Exotic and efficient languages indeed narrow down job opportunities. It’s not a problem if you can count on trust, and it can even be an advantage WRT your income.

                                            1. 2

                                              In my experience “full stack” has always meant “expert in JavaScript, so you can program the front end and the back end (using Node.js)”. Knowledge of databases and HTML+CSS included of course, but the main point is the JS.

                                              I also have the impression, like you mentioned, that for full remote work, web development is what is expected. Because the medium allows it very easily.

                                              1. 2

                                                I also have the impression, like you mentioned, that for full remote work, web development is what is expected.

                                                Thank you. I guess this is a bullet that I am going to have to bite.

                                                1. 2

                                                  If you need direction, feel free to ask me. me@greduan.com 😁

                                              1. 2

                                                Being able to work independently is much more important than technologies you know. If you can demonstrate:

                                                1. That you can go and work unsupervised and come back in a week with something good. (This is important in all jobs, but even more so in remote jobs.)
                                                2. That you can learn new technologies quickly.

                                                Then it matters much less if you know the language at hand (for good companies).

                                                You ought to be able to explain both of these decently in cover letter/resume, with examples etc.. (Long version, not specifically targeted to remote work: https://codewithoutrules.com/2018/01/23/job-with-technology-you-dont-know/).

                                                1. 1

                                                  Then it matters much less if you know the language at hand (for good companies).

                                                  This certainly should be true. It has definitely been true when I have hired people. However, I rarely see this attitude in job ads.

                                                  1. 1

                                                    People who write job ads aren’t usually very thoughtful about what they write. It’s just rote regurgitating of the standard format for job posting. (Lynne Tye is person who is trying to improve this from company’s side - see my interview with her - https://codewithoutrules.com/2017/12/01/interview-lynne-tye/ - and her job site - https://www.keyvalues.com/).

                                                    If you pitch yourself in way that actually meets their needs, you can get the job regardless, because they’re like “oh right we do need that” even if they can’t consciously articulate it.

                                                1. 7

                                                  SQL is something that everyone needs to learn better (including, sadly, the people doing the interviewing). I often see people doing something in two dozen lines of JS or Python (and two or three round-trips to the DB) that could be done in a single, well-written query.

                                                  Otherwise, Python is what everyone uses, JS is what management thinks everyone should use, and Go is the new hotness.

                                                  1. 5

                                                    When I was in charge of a product, we did as much as possible in SQL. For most requests, we would get JSON from Postgres and send it straight to the client. The longest queries we had were about 200 lines (we used CTEs a lot), but I believe that they were shorter than corresponding JavaScript, and we only needed one roundtrip to the database instead of several per request. It worked well.

                                                    I agree that SQL is underrated.

                                                    1. 2

                                                      SQL is something that everyone needs to learn better

                                                      Any books or other resources you would recommend for upping ones (Postgre)SQL game to mastery?

                                                      1. 1

                                                        SQL is something that everyone needs to learn better

                                                        I rarely deal with databases in my current job (I mean, “real” databases, rather than just flat files of data). I can write simple SQL queries, and have done for personal websites, but I don’t know it well. Thank you - that’s clearly something for me to study more.

                                                        […] Go is the new hotness.

                                                        That’s promising. I really enjoyed the small amount of Go I did recently.

                                                      1. 2

                                                        Most fully remote positions tend to be with companies developing web-delivered products. They might be building something the company owns and sells, or something the company needs to do it’s other business (product jobs) or alternatively, the company could be contracting project work to clients and maintaining a full-time staff with which to implement them (project jobs). These might a web agency for example, who businesses pay to build a site or make changes to their site, or a group that mainly rents out teams of their salaried employees to enterprises who need to build some software, but don’t need/don’t have the resources to manage their own in-house team, like Atlassian.

                                                        In these web-delivered areas, “full stack” usually means you work on both sides of the client-server divide. So, you might be working on say, Java / Python / node / Ruby for the part of the application that handles web/api requests, as well as needing to be able to interface from there to a database, so usually some form of SQL. And the front-end is nearly-always HTML, CSS and JavaScript + various libraries / frameworks.

                                                        Wether or not you’ll be expected to also administer+secure Linux machines, web and database servers is mostly a factor of how big the company is, more than anything else. On larger teams, I’ve had to get DBA approval for anything that changed the structure of tables or constraints, and on the smallest teams we’ve had developers on a roster for cleaning the shitter.

                                                        1. 1

                                                          Most fully remote positions tend to be with companies developing web-delivered products.

                                                          Thank you, that’s something I suspected but wasn’t sure about.

                                                          In these web-delivered areas, “full stack” usually means you work on both sides of the client-server divide.

                                                          OK. That’s harder for me. I’ve done a little bit of front-end work, e.g. web GUIs for managing hardware devices, but it is far from my expertise. I’m also terrible at graphical UI design!

                                                          Wether or not you’ll be expected to also administer+secure Linux machines, web and database servers is mostly a factor of how big the company is, more than anything else.

                                                          Somehow, regardless of company size, I always seem to end up administering servers. I’m not quite sure how that happens…

                                                          Thank you for your advice.

                                                        1. 2

                                                          How remote are you looking for? Like go to office once a week, month, year, only for interview, or never?

                                                          My current company does 100% remote for fulltime, like multiple workers living multiple timezones away from any office, and we’re like 90% web and mobile. My impression of the market is that it’s more like the kind of companies that are okay with 100% remote are likely to be doing web work. It’s probably good to get a good understanding of at least one of the big interpreted languages - PHP, Ruby, Python, plus Javascript and SQL. Even more so, to have a good understanding of how all of the parts of the web work together, including HTTP requests, servers, logging, basic unix server sysadmin, etc, and be able to diagnose and solve problems at any level.

                                                          If you don’t have the spare personal time to do something like build a dynamic website yourself or quit and take a class for a while, you might find it more useful to try and get some type of intermediate job between what you do now and what you really want to do. Maybe an in-house job working on a C/C++ web backend, so you already know like 50% of what you’re doing in the C++ code, and can be productive while you get up to speed on SQL, Javascript, and HTTP mechanics. Do that for a year or two, and write utility scripts in Ruby or Python while you’re at it, and then take a look at transitioning again to a more mainstream web shop.

                                                          1. 1

                                                            Like go to office once a week, month, year, only for interview, or never?

                                                            That depends on how far away the office is. Once a month would be fine. Once a week would be acceptable it if were close. Never would be awesome :)

                                                            I have actually done most of the things you suggest, over the years. Maybe I’m not quite as inappropriately skilled as I thought I was. Maybe I just need to think more carefully about my past experience when applying for a job. I don’t know - I’d be uncomfortable claiming lots of web experience when I’ve just written a few personal sites and modified an internal corporate web GUI. Thank you, you’ve given me something to think about!

                                                          1. 3

                                                            What’s that quote about asking ten engineers for advice and getting ten different answers? :-)

                                                            I’ve been full-time remote for quite a few years now. The languages I use daily are Python, and for automation related work, Ansible. I don’t code in Java at all, but sheer weight of worldwide use would indicate that might be a solid bet for you too.

                                                            For personal projects I’m a big fan of Go, and hope to make use of that more on the professional side of my life eventually. I see it on the rise.

                                                            1. 1

                                                              I have written a fair bit of Python but usually as glue code. I managed to convince my manager to let me use Go for a recent project and loved it. I am a Plan 9 fan and it all felt very familiar and well designed. However, in my current field - robotics - pretty much everything is C++.

                                                            1. 3

                                                              Two remote work job sites I keep an eye on are We Work Remotely from DHH and what was 39signals, and remotive.io - which is more startup focused.

                                                              …but my hunt for remote work hasn’t been successful yet…

                                                              1. 2

                                                                Thank you, I will watch those sites too. Good luck in your own hunt!

                                                              1. 4

                                                                I am doing remote work for 5 years now and it is always on the JVM. I am working in the big-data area, but I have touched the frontend from time to time as well.

                                                                For me personally the biggest hurdle with remote work is not the remoteness, but the time zone difference. I am 9 hours ahead of the company I work for, so that can be very challenging at times, but so far, it seems to work okay.

                                                                1. 1

                                                                  I am doing remote work for 5 years now and it is always on the JVM.

                                                                  That’s interesting, thank you. I was once quite proficient at Java - back in the days of Java 1.5/6 - but I didn’t like it much so have avoided it for the last decade or so. There’s a lot more running on the JVM these days though. Do you see much demand for Clojure, for example?

                                                                  I am 9 hours ahead of the company I work for

                                                                  I used to be 8 hours ahead of most of my company (I was in a satellite office). I loved it! I got most of my work done when the rest of the company was asleep.

                                                                  1. 1

                                                                    This is my second remote Java job in a row and it was always pure java. In BigData-land you see a lot of scala, but not much clojure.

                                                                1. 10

                                                                  When web agencies/developers say “full stack”, in my experience they mean “jack of all trades, master of none”.

                                                                  Someone who is equally happy writing php or nodejs as browser javascript or css. Possibly SQL. In todays climate they probably expect ‘devops’ which for the type of shops saying ‘full stack’ probably means “search for a docker image that sounds reliable and cross your fingers”.

                                                                  Given your history with compiled languages, perhaps mobile app development is a good route? It’s definitely a market with demand right now.

                                                                  Alternatively look on some of the remote specific job boards. https://github.com/lukasz-madon/awesome-remote-job/ may also help.

                                                                  1. 8

                                                                    When web agencies/developers say “full stack”, in my experience they mean “jack of all trades, master of none”.

                                                                    I always interpreted it as a way of saying “I am unaware of any abstraction layer lower than the virtual machine”.

                                                                    1. 2

                                                                      I always interpreted it as a way of saying “I am unaware of any abstraction layer lower than the virtual machine”.

                                                                      I think “full stack” is a web term, where the stack basically ends at the virtual machine. In web you basically outsource the lower parts to your SaaS provider anyway.

                                                                      I have never seen “full stack” desktop developers or “full stack” HPC “full stack” compiler developers or whathaveyou.

                                                                    2. 1

                                                                      When web agencies/developers say “full stack”, in my experience they mean “jack of all trades, master of none”.

                                                                      I worried as much.

                                                                      […] perhaps mobile app development is a good route? It’s definitely a market with demand right now.

                                                                      Thank you. I will take a look at that.

                                                                      https://github.com/lukasz-madon/awesome-remote-job/ may also help.

                                                                      Thanks for that too!

                                                                    1. 10

                                                                      My main editor is acme(1), sometimes I fire up sam(1) when I either do batch edits, or when I need to do more than quick edits on remote computers. However, for general system administration of remote computers, I use ed(1), the standard editor. Its main feature compared to vi(1) is that it doesn’t take over the screen, so I don’t lose context of all the history. I find that valuable.

                                                                      While I don’t think anybody should switch to ed(1), I think that knowing how to use it is essential, and the value of not losing context while editing text should be more appreciated.

                                                                      1. 4

                                                                        Wow, I’ve never seen anyone actually using acme outside of the plan9 team and maybe the cat-v crowd. What do you use it for? Why do you use it?

                                                                        I have it installed via the plan9ports on my laptop, and sometimes play with it, but since I’m so used to either vi (specifically nvi or vis) or emacs keybindings, I can’t really be productive in it. And I can’t even start using sam, although I do have experience with writing scripts with ed, and have used it over slow ssh connections.In fact I belive that it might have been exactly the linked article that pushed me to bother learning anything about ed. Would you know of any resources like that for acme or sam?

                                                                        1. 10

                                                                          I use acme for everything that involves text files, source code or otherwise. It’s the single most important program that I use. If acme were to somehow disappear from the face of the Earth tomorrow, I would re-write it. All my friends who use acme say that they would do the same. Fortunately, because acme is so small and so simple, that wouldn’t take very long.

                                                                          I use it because it’s by far the best text editor. As for why it is the best text editor, that is rather difficult to explain. I could enumerate a list of features, but realistically that wouldn’t be very enlightening. It’s not any single feature, it’s the whole package, and you have to experience it.

                                                                          The most important things to me though are the mouse-based interface, the fact that text is executable, and the fact that it doesn’t have any configuration options. I suggest watching the linked Russ Cox video, it does a good job demoing acme.

                                                                          As for sam, I don’t know of any other resource rather than the sam paper. I don’t like the sam user interface, I’d much rather use acme, but some people disagree about that and prefer sam. However, sam has some features that acme lacks. The way the program is split into multiple processes means it works extremely well for editing remote files. Even better than ed. The user interface always runs on the local terminal, while the server side does the actual edits. The protocol is extremely efficient, not just in throughput, but in latency too. Editing files over satellite connections with seconds-long pings is doable.

                                                                          However, what sam really excels at is editing multiple files at once. I routinely edit thousands of files at once in sam, e.g. when doing large scale refactoring. I know of no better tool for that than sam.

                                                                          1. 1

                                                                            What OS(s) do you use acme and Sam on?

                                                                            1. 2

                                                                              I use sam on everything that I use, macOS, Solaris, Linux, FreeBSD, OpenBSD and Plan 9.

                                                                              I use acme on my workstation systems, macOS and Plan 9. Exceedingly rarely I get to use a Linux desktop system. Then I use acme there too.

                                                                              1. 2

                                                                                Sounds like you use Sam like I use vi keybinds: Everywhere it can possibly fit.

                                                                                I think that for me, the lack of syntax highlighting is probably one thing that will keep me from using Sam/Acme for the indefinite future, as fascinating as they are.

                                                                                1. 3

                                                                                  syntax highlighting

                                                                                  Try dropping it for a while. You might not miss it as much as you’d think!

                                                                                  I personally thought I’d never live without it, but nowadays the only time I notice its absence is when I forget to close a string literal. Otherwise, I’m far happier without it.

                                                                                  1. 3

                                                                                    I’ve dropped it on and off when I was experimenting with using greyscale on my screens. But there are places (like HTML templates with Angular), that really suffer if you don’t have syntax highlighting, at least they did for me.

                                                                                    1. 3

                                                                                      Greyscale screens!? Trip report needed!

                                                                                        1. 1

                                                                                          Basically using color space simulation to get a monochromatic screens. It doesn’t get rid of syntax highlighting entirely, but reduces it by a lot, and can be pleasant when code is well structured. HTML templates aren’t given to being structured well

                                                                          2. 3

                                                                            Have you checked out vis? It is a bare-bones vim w/ sam commands. Plus it be used as an interactive filter when piping commands.

                                                                            1. 3

                                                                              I know about vis, but I never had any interest in trying it out. In general, I stay away from curses programs if I can help it, and I also avoid installing software if I can help it, even though it might be useful. I’d rather use a real GUI program, or some command line program (non-curses). Preferably something that already comes with the system (acme fails the last requirement, sadly on some Linux distributions ed fails too). I use irssi regularly and it bothers me greatly that that is the state of the art.

                                                                              1. 1

                                                                                I use irssi regularly and it bothers me greatly that that is the state of the art.

                                                                                irssi was state of the art in…. 1999? It’s certainly not in a world where WeeChat exists, let alone protocols that claim to obsolete IRC.

                                                                                1. 2

                                                                                  I looked at weechat, and it was a curses program, exactly like irssi. To me, there’s no real difference. Except that it also had a web frontend, which made it worse (!). Plus weechat, in its default configuration used more screen estate than irssi, which to me again made it worse. But thanks for the suggestion, I am very interested in alternative IRC clients.

                                                                                  Other protocols have no value to me because of network effects.

                                                                                  1. 1

                                                                                    If you’re some kind of purist, ii works.

                                                                                    1. 1

                                                                                      Yeah, I need to try out ii and ircII.

                                                                                      1. 1

                                                                                        Isn’t there an IRC client (or however one would want to call it) for Acme?

                                                                                        1. 1

                                                                                          There is, but in my opinion it is not very good, and I don’t really like programs that use acme as their interface. I prefer to use acme for editing text only.

                                                                                          1. 1

                                                                                            IIRC (lol), ii exposes all kinds of magic files for interacting with channels. I think that’d integrate nicely with Acme by default

                                                                                  2. 1

                                                                                    Something I do fairly often is SSH to a remote server to take a look at its logs. I could cat(1) the log file to read it, but if it is long (most are) then it will wipe out my terminal’s history (or at least force me to scroll back for miles) so I lose my context. less(1) is really handy for interactively taking a peek inside a log file, scrolling around, searching for the next occurrence of something I’ve found, etc. But it is a curses program. Do you ever do this sort of thing? What do you use?

                                                                                    1. 1

                                                                                      I use less (or more). It’s not ideal, but I use it.

                                                                                      1. 1

                                                                                        Damn, I was hoping you had a different solution that would work with 9term :)

                                                                                2. 2

                                                                                  Which version of Sam do you use?

                                                                                  1. 1

                                                                                    The one in plan9port, or the one in 9front.

                                                                                  2. 1

                                                                                    That’s an interesting way to preserve history! Never thought about it.

                                                                                    Any tmux users? I usually use it, so I split horizontally to preserve history. A bit of a newschool solution ;)

                                                                                    The -4d and -2,5t. stuff is imo the most valuable take-away. I use it in vimlikes, but I would appreciate it in any other editor as well!

                                                                                  1. 6

                                                                                    That’s the most sensible and collectivism-free piece of RMS’s writing I’ve read in a long time. Bravo.

                                                                                    1. 27

                                                                                      collectivism-free

                                                                                      What does that even mean

                                                                                      1. 1

                                                                                        I’ll let @Sophistifunk speak for emself, but I read this as referring to Stallman’s fundamental mistrust of proprietary anything.

                                                                                        1. 4

                                                                                          Ok, now why is that supposed to be “collectivist”?

                                                                                          1. 1

                                                                                            What the hell is “nur”?

                                                                                            1. 2

                                                                                              A typo made by my oversensitive Samsung keyboard on my phone, which was set to German. “Nur” is German for “only so ultimately, it wasn’t that horrible.

                                                                                            2. -1

                                                                                              OK, let’s look at the definition:

                                                                                              col·lec·tiv·ist kəˈlektivəst/ adjective adjective: collectivist

                                                                                              1.
                                                                                              relating to the practice or principle of giving a group priority over each individual in it.
                                                                                              "collectivist cultures had disciplined and cooperative work forces"
                                                                                              

                                                                                              Stallman’s basic assertion is that individuals should not profit from the creation of software. They may profit from supporting said software, but in his view, software should always be free. I see this as a fundamentally collectivist philosophy.

                                                                                              1. 9

                                                                                                Stallman’s basic assertion is that individuals should not profit from the creation of software.

                                                                                                What, no:

                                                                                                Actually, we encourage people who redistribute free software to charge as much as they wish or can. […] Distributing free software is an opportunity to raise funds for development. Don’t waste it!

                                                                                                https://www.gnu.org/philosophy/selling.html

                                                                                                1. 2

                                                                                                  Setting aside that “the definition” is rarely a good argument in open-ended discussions, like these, Stallman doesn’t say that Individual aren’t allowed to profit from Free Software. It’s explicitly allowed and I remember having have read that Emacs used to be sold this way, before the internet, to fund the FSF. And secondly, it doesn’t matter if the software is sold by one person (an individual) or a company (a collective), the rules the GPL sets up stays the same: share your source while distributing software, recursively, exactly by intelligently twisting copyright law back against itself.

                                                                                                  And in the end, the four software freedoms were formulated to protect individuals from harmful sodtware, as well as give them the ability to improve upon it, based on their needs.

                                                                                                  This is just another example of how empty of an actual meaning the word “collectivism” actually is in practice.

                                                                                              2. 2

                                                                                                What the hell is “emself”?

                                                                                                1. 9

                                                                                                  A polite way to refer to someone when you don’t know their gender.

                                                                                                  1. 3

                                                                                                    I’ve never seen that before. What’s wrong with “themself”? Does it in some way discriminate against one of the two genders?

                                                                                                    1. 2

                                                                                                      “themself” isn’t an established word either so i guess people pick and choose

                                                                                                  2. 7

                                                                                                    At the time of writing I had no idea whether @Sophistifunk was a him or a her. https://en.wikipedia.org/wiki/Spivak_pronoun

                                                                                                    1. 5

                                                                                                      That’s one of the better singular pronouns I’ve seen. It reads like a shortening of plural “them”.

                                                                                                      1. 8

                                                                                                        “they” and “them” are already well established in usage as singular pronouns.

                                                                                                        1. 3

                                                                                                          So you’re saying “I’ll let @Sophistifunk speak for themself” is correct usage in this case?

                                                                                                          I’m not a grammar expert, so I’ll defer to your greater knowledge. I like and use Spivak because, as @pushcx said, it’s a polite way to express “I have no idea what the gender of the person I’m referring to is.”

                                                                                                          1. 8

                                                                                                            Singular “they” has been used in English for hundreds of years. “Themself” is also ancient but was replaced by “themselves” in the 16th century. However, it has recently made a comeback.

                                                                                                            “I’ll let @Sophistifunk speak for themselves” is perfectly correct formal English. “I’ll let @Sophistifunk speak for themself” is also correct by any reasonable standard, but may be considered informal by some readers.

                                                                                                            The OED has a blog entry about ‘themself’.

                                                                                                            1. 2

                                                                                                              I still like Spivak, but thanks for the pointer. That’s good to know :)

                                                                                                            2. 3

                                                                                                              Mirriam-Webster has examples of how “they” is used for indefinite gender and number: https://www.merriam-webster.com/dictionary/they

                                                                                                              They don’t have an entry for the word “themself” and suggest “themselves” instead: https://www.merriam-webster.com/dictionary/themself

                                                                                                  3. 1

                                                                                                    I mean that it’s free of the “narrow-scope-communism” he’s usually on about. I don’t think I’m putting false words in his mouth if I say he firmly believes non-communal ownership of software (in the sense you can restrict what others do with it) is some sort of moral wrong and should be fought on all fronts. But I don’t want to call him a communist in the general sense, because he doesn’t go around saying private property in general is evil, just private property in the form of bits.

                                                                                                    1. 5

                                                                                                      Maybe everything to your left looks communist-ish, but I can tell you for sure he’s not a communist. More like a typical left-leaning liberal, but not too much.

                                                                                                      1. 1

                                                                                                        But I don’t want to call him a communist in the general sense, because he doesn’t go around saying private property in general is evil

                                                                                                        Was that somehow unclear?

                                                                                                1. 17

                                                                                                  I took a job at a hospital a number of years ago building applications for internal clinical use. I get to talk to physicians, see how they’re using my applications, and how they improve outcomes for the patients. Knowing that the apps I work on directly affect patient care makes the work feel a lot more meaningful than any other job I’ve done previously.

                                                                                                  1. 5

                                                                                                    Been thinking about OP’s question and people who work close to the medical field for some time. Glad to know it’s fulfilling.

                                                                                                    1. 7

                                                                                                      I just left a small startup in the Rochester, NY area called Bryx (https://bryx.com), and we’ve gotten some incredible feedback from people saying how much easier their lives are that they don’t have to sit, blocked, waiting for pagers and faxes to be able to get routed to fires and EMS calls.

                                                                                                      It’s incredibly fulfilling.

                                                                                                      1. 3

                                                                                                        Awesome. The feedbacks help a ton.

                                                                                                        1. 3

                                                                                                          That sounds amazing. Would you mind going into a bit more detail about Bryx? If you’re allowed to say, what sort of technology/languages/stack does it use?

                                                                                                          1. 1

                                                                                                            Just saw this reply. The API is entirely implemented in Kotlin, the backend receiving jobs from departments and putting them into our (for better or worse) MongoDB instance is all Python. The Android app is a mix of Kotlin and Java, and the iOS app is entirely Swift. We have a desktop Electron app and a management site that are written in TypeScript. We’re really big fans of the new developments in programming languages and we’re huge fans of type safety. Specifically, we like type safety because our old PHP API caused so, so many bugs in production from accidentally misspelling variables and a lack of enforced structure.

                                                                                                            1. 2

                                                                                                              Thank you, that’s really interesting.

                                                                                                      2. 3

                                                                                                        Please could you describe the applications a bit more? In particular, what sort of languages/software stack/environment do you use? I have occasionally thought about doing something similar - mostly when I get depressed about working for morally dubious people - but my skills and experience never seem to be a good fit.

                                                                                                        1. 2

                                                                                                          I actually did an interview about my work recently here.

                                                                                                          1. 2

                                                                                                            Cool, thank you.

                                                                                                      1. 6

                                                                                                        We design and produce rugged VoIP phones used on industrial and roadside installations. They run 24/7; some are out in the field for over a decade with uptimes measured in years. I know they were used a few times by people caught in tunnel fires and accidents. Nothing really on the scale of what paramedics of firefighters do, but it is satisfying anyway.

                                                                                                        1. 1

                                                                                                          This is cool. May I ask you what I’ve asked a couple of other people in this thread: what does the software stack look like for these devices? I’d love to know what technologies (programming languages, software stacks, etc.) are used in tech jobs that don’t suck.

                                                                                                          1. 5

                                                                                                            Sure, it’s nothing unusual. Heavily patched Linux, busybox, userspace code is in C99 for the most part. A bit of Verilog on the side for FPGA-based peripherials controller. Java for the operator’s mass provisioning application. Plenty of work went into device drivers, especially audio codec driver to get the best performance: we have highest possible Speech Transmission Index score. Status reporting and management via Modbus and SNMP, and a special subsystem dedicated to self-diagnostics and failure reporting.

                                                                                                            1. 1

                                                                                                              Thanks, that sounds fun.