1. 15

What’s your programming workflow like? What tools do you use to facilitate your work? (e.g., language, IDE, plugins, command-line tools) Feel free to wax poetic as much as you want, we’re looking for in-depth answers here!

  1.  

  2. 10
    1. prioritize projects in void
    2. break a project into milestones in void
    3. plan milestone in pomodoro-sized chunks in void
    4. write basic protobuf files for milestone
    5. write mockable messenging system (and clock, disk, io…) that plugs into either sockets/real version or a test harness that will use quickcheck to induce partitions, swizzle messages, fill disks and advance clocks rapidly in fake time
    6. write correctness properties of system
    7. write e2e test for milestone
    8. write unit test for component
    9. write component while quickcheck is blasting away, catching tons of assumptions as I go
    10. when I hit pomodoro boundaries, distract myself as much as possible, prefer physical activity, let subconscious GC the problems I was thinking about a little bit.
    11. load test with loghisto and opentsdb (logarithmically bucketed histograms ftw)
    12. dstat, flamegraph for guiding optimization

    (my projects tend to be performance-minded reliable distributed systems)

    tools:

    • void information organizer for the terminal
    • tmux + vim
    • rust / erlang / python
    • opentsdb
    1. 6

      Wow, I’m really glad I read through this discussion section - I was recently going through a new year planning exercise and wishing I had something basically identical to void.

      It’s also really instructive to read about distributed system programming specifically - I’ve recently been doing stuff at work that would benefit from a lot of this structure. Thanks for writing it up!

    2. 6
      1. Write a new or edit an existing README. Tom Preston-Werner wrote a great article.
      2. Play in a REPL for a while, sketching out data structures, algorithms, data and dependencies.
      3. Write some tests. The first one(s) probably stolen from README examples.
      4. Write some code.
      5. Build.
      6. Reflect.
      7. Go to #1.

      I use vim. I also use IntelliJ (Java) and XCode (Apple). I write shell scripts and abuse build tools. I am a fanatical about automation.

      1. 3

        To start out with, I have a “dev” user account so that my work environment is completely separate from anything personal. This means I don’t have to worry about separate profiles for Chrome and Firefox or any other per-application isolation. This also means that my dock is filled with only the applications I will ever use such as all of the browsers and their betas as well as Textmate, Terminal, Github, Mail, Skype (some clients like to use that), and any folders local and remote for the projects I’m working on.

        I use LiveReload in combination with a basic sass --watch or compass watch as a very basic way of automation. I run a very basic python -m SimpleHTTPServer just so that I don’t have to deal with browsers that try to open up other applications when I’m browsing files locally. I’ve always used the iOS simulators, but more and more I’ve relied on the responsive views in various browsers.

        I use RVM which I’m not a fan of just because it complicates the process, but it’s necessary to have some sort of manager for Ruby otherwise you’ll land into a bunch of weirdness that you didn’t even think about.

        I’ve started using Digital Ocean to test projects remotely in which case I have a default nginx or apache server for dealing with the files that I scp (like an animal) to.

        1. 3

          I use RVM which I’m not a fan of

          Have you looked into chruby? I just switched to it from RVM and it seems to work well.

          1. 2

            I took your suggestion and installed it. My main gripe is mostly with “kids these days” and needing to install all this extra stuff for Sass/Compass (even if Sass is extremely helpful and I couldn’t work without it).

            I like that chruby is more “Unix-y” and simply does less, but I was caught off guard by the fact that it does not automatically switch rubies. I would recommend it to anyone who uses Ruby simply as a way to get something else done.

            1. 3

              There’s chruby-auto which will automatically switch rubies, if that helps.

        2. 3

          For a new prototype, it’s usually not much more complicated than git init (or cargo new or whatever is appropriate), start vim, hack, ^Z, make, fg, hack some more, ^Z, repeat.

          At some point I start tmux because the backgrounding is getting annoying/I want to leave the program running while I continue to hack.

          1. 2

            I work mostly in Haskell or JavaScript although as I get more into data science I anticipate Python to take up more usage. ELisp because Emacs. With Haskell I start with types.

            Emacs as my “IDE” unless I can’t make changes to a file “on save” as some open source projects don’t control for whitespace on the end of lines and such. If it’s not Emacs it’s probably Sublime Text.

            ITerm2 (because Mac) and zsh are where I spend my time when I’m not in Emacs.

            Pretty much everywhere I do work uses git in some form (GitHub, Phabricator, etc).

            If I control a project end to end my stack looks like:

            • Paper or org-mode, then Sketch or Photoshop
            • React (or Preact) for webapps and static sites. A litany of JS tooling: babel, glamor, webpack 2, apollo/redux, etc. I build frontends based on APIs these days (as opposed to rendering html in Rails/Django/etc and “sprinkling” JS). If I need to render HTML I’ll use a Universal architecture with React although PWA patterns seem to be better for people with spotty connections these days.
            • GraphQL endpoint. I’m working on a Haskell GraphQL implementation so I can swap node out but might also move to Elixir or similar in the near future. This is the point-of-entry for any UIs and allows a much nicer interface than REST.
            • Haskell and Servant for microservices. Still using JSON for communication and it would be nice to have something “better” like grpc. There’s no grpc implementation on Hackage, so I need to find the time to write it myself if I want it.
            • Docker for deployment (and development env if I have enough services to spin up). I like Swarm’s services model and TLS by default, etc. Alpine as the base for as many images as possible.
            • Postgres is my go-to database with sqitch to perform migrations, etc.
            • Terraform is becoming my go-to for setting up new servers.
            • Digital Ocean has served me well in the past but I’m considering moving to AWS for my personal work because it makes more sense from a “marketable skill” perspective.
            • Prometheus for monitoring

            Because I bias towards starting with microservices I’m also pretty set on automating as much as possible. Infrakit is interesting in the “server automation” space since it can use Terraform to set up the servers. CI/CD, lerna-semantic-release for JS-based monorepo stuff, etc.

            I feel like my workflow is different for each isolatable portion of the stack, so I won’t list them all since this is getting long :)

            1. 1

              I’ve been doing a lot of stuff with scheme recently. I work in vim + tmux, and generally start with three panes: one for my editor, one for my REPL directly below, and one for tests. I’ll set entr to run my test file on every *.scm file change and have tslime setup in vim so I can quickly send stuff to my REPL.

              I also have been working through The Little MLer, and use roughly the same workflow (minus the tests). I like being able to view code in an editor rather than trying to write large chunks of code in a REPL, so I’m pretty happy with my workflow at this point.

              The biggest issue I have is I wish there were a window manager that allowed me to ignore windows in my alt-tab list while still being able to view them (I’m currently using cwm). This would allow me to move my tests to a separate window without getting in the way of my alt-tabbing around. I might fork cwm and add an ignorelist feature to it at some point, when I’ve get time :P

              1. 1

                We do pair programming so the first thing is I talk to my pair about what ticket we want to take next in JIRA (usually there’s more than one with similar priority, but obviously if one stands out that’s the one we take.)

                We’ll choose either my or my pair’s cloud9 workspace to work in, create a branch in Git related to the JIRA ticket id, and then open/create relevant files for the ticket.

                Make changes to the relevant files (for my job this is usually in PHP, sometimes JS, sometimes HTML/SCSS), update/create unit tests, commit the branch (all unit tests for the repo run on a pre-commit hook) and push it up to the main repo. Then we’ll post a code review, move the ticket into Review status and move on to another ticket.

                I really like cloud9 for pair programming. I works really well for us, we use it in SSH workspace mode so we’re doing development work on our own development servers.

                1. 1

                  Started a new job in Ruby on Rails recently, first time working in open-source full time. Been using the same toolset I’ve used for personal work on that stack for a while.

                  For assignments, we have standard Agile stuff. We use Jira, which maintains a list of stories in our sprint and who’s working on them. With daily scrums, the team has a pretty good idea of the rough status of everything and what everyone’s thinking of working on next. Also getting used to spending a fair amount of time reviewing teammate’s code/PRs - we use Github private for all of our projects. For personal projects, I haven’t found much value in maintaining really formal lists of tasks. At most, just a quick text file or something.

                  Main toolset is tmux+vim with a few plugins. Rvm, Bundler, and Git to manage code and plugins and versions and such. Been using Pry Debugger for all debugging, which mostly works well. Our team does mostly backend stuff, so only occasionally need Chrome and debug tools, and sometimes use Postman for sending requests. Using MySql and Postgresql for databases, with Sequel Pro and PSequel, respectively, for most DB connection needs - using command-line for even light DBA stuff doesn’t appeal much to me.

                  For work organization, we’re using email, Slack, Jira, and Github PRs mostly, and I also keep plain-text diary-like notes in this tool I built that I’m calling Daily Notes. All of the other tools that I’ve found for doing stuff like this put too much process into it IMHO, or don’t work well for multiple years worth of notes. I wanted something to hold and search years worth of daily notes in a way that kept plain, dumb text instead of trying to force me into some particular workflow, and would be on a server to access from multiple locations, etc. Naturally, I just built it instead of looking really hard for something already out there.

                  1. 1

                    I am still a student, but I still do some programming on my free time.

                    I use a terminal multiplexer – dvtm, some vi-like editor, and command line for everything if possible.

                    I wrote something on how to manage terminals while working in the command line.

                    I used Emacs before too.

                    1. 1

                      Gitlab, geany, make, c++, git-gui, gitg, and meld. And a browser.