That was a great talk! Notice how his entire career got launched from an internship at Tektronix. I love the bit about how he found his own troff macros in use at O'Reilly because a coworker had taken his code there years before -- and he appreciated that! One might say that the same kind of "80's hacker ethic" is what got him into trouble at Intel.
The Camel book was so well-written. It was my introduction to Perl, which became my "superpower" in the 90's and far longer into the 2000's than I tend to admit. I eventually switched to Python because it's the closest thing that is considered an acceptable "modern" choice. I really enjoy Python too, but the obligatory XKCD about Python[1] rang true for me about Perl first.
For me the #1 superpower strength of both languages is the first-class treatment and syntactic sugar for associative arrays (a.k.a. hashes, dictionaries).
Perl did the same for regexes and file I/O; Python did not.
I have come to appreciate Perl's backwards compatibility -- that old scripts still run unchanged -- though maybe that's largely because Perl 5 has been in maintenance mode for so long.
Thank you for this article. One of the great frustrations of using Magit for Emacs is the inability to read things because the foreground and background colors for various things end up the same on some platforms.
From this article I found the command "toe -a" and was able to try various TERM values until I found one that makes Magit readable: vt100. This turns off colors entirely, which may not be pretty, but at least I can read everything now.
1982 Atari 800 here (was 8 years old at the time). I remember thinking the same thing at the time. When we first bought the thing, there just wasn't much I/O beyond the tape drive (and later the disk drive), and therefore the things we could do seemed very limited. It wasn't until we got a printer (a Star Micronics SG-10 dot matrix tractor feed) and a 300-bps modem that the world really opened up!
>The best memories I have was that probably, this was the first time I had that "feeling" of having built something useful to somebody. And certainly the best moment was when one of his suppliers who also accepted those coupons asked us for a copy of the program. Great times.
And then you go off to college, and one day the program stops working because of one problem or another, and they call you in the middle of studying for final exams, and that's when you learned about technical support and technical debt and all the things that make programming less fun!
Some people have recurring dreams in which they show up to school or work in their pajamas... my recurring dream is that some program I wrote in high school is still being used twenty years later, and they come calling because something broke...
You and I sound like we had very similar childhoods . . .
I wrote a tool that managed a bunch of information related to the AP Computer Science exam[0] which my High School continued to use for 10 years after I graduated. I had received a call on it once, five years after I graduated, from a guy filling in for the teacher I wrote it for and I ended up working with one of his students to figure it out ... while at the Atlanta airport, traveling for work. :)
[0] I don't recall the details, but it was a surprisingly involved text-based pascal program.
I'm gonna be honest, if I'm just sitting in the airport with not much to do, this sounds like fun. No pressure, just taking a call and debugging an old script, with a chance to give a kid a good story/learning experience...
"C'mon kid, I had it working for 5 years and you broke it? What'd you do!" :)
Oh, man, the only thing better would have been if one of my colleagues was there with me... I was very young in this job (19, first real job, next youngest was 26). Waiting on my bags, traveling for business as a 19-year old kid and fielding support calls for software I wrote on the side. Even without any witnesses, it felt pretty damn awesome. I remember the incident very well because the flip side was that I was scheduled to work at the switch site in Downtown, which meant I was staying at a really nice hotel and besides the software issue, I had a much more pressing problem of Northwest Airlines[0] having managed to lose my bags on a direct flight and I had failed to pack the usual emergency items in my carry-on[1].
[0] Yup, it was that long ago.
[1] Someone told me "they don't lose bags on a direct flight". Very wrong. Lost them on the way back, too -- same fscking trip. But Detroit opened a new terminal and was having a "holiday baggage handling crisis"; after a few weeks they compensated me and sometime the following summer my bag appeared on my front porch. The "crisis" only affected international flights, so I wonder if my luggage had a better trip than I did. It was seriously more than 6 months lost.
Software lifetime is an interesting topic. See for example [1], a 1992 paper that surveyed business applications and found an average lifetime of about 9 years, with a maximum of 20 years and a minimum of 2 years. 2 years versus 20 years!
Things don't seem much different today.
On the one hand, HTTP, HTML, and producing HTML server-side in a language like Java or Python and with a SQL database isn't all that different now than it was 20 years ago. There are Java web apps developed in 1999 that are kept up-to-date and work just fine in 2020. On the other hand, there are applications developed with popular technologies a just a few years ago that are hopelessly out-of-date and in need of a rewrite today.
I see it as an end user too. I've been an ING Direct (now Capital One 360) customer for 18 years. The web app that I use in 2020 seems to do the same things as the one in 2002 (though it's slower today), but it seems like it's been completely rewritten at least three times.
_That_ is the question we should be asking. If not, is it because geofence warrants have a higher legal bar if issued to a phone company? Or is it about the level-of-effort?
Apple did decide to not support it, but they didn't decide not to support a thriving product - it's like 3 1/4 floppy disks, when the iMac decided not to include a 3 1/4 drive people grumbled but it was mostly dead tech, writable CDs had become wide spread enough to obsolete it - with flash, when Apple decided to drop support, they did so in an era where preferred alternatives already existed and the tech was thoroughly reviled - so Apple put the final nail in the coffin, but flash was already in the ground at that point.
> when the iMac decided not to include a 3 1/4 drive people grumbled but it was mostly dead tech, writable CDs had become wide spread enough to obsolete it
The G3 iMac did not include a CD writer, so if you wanted to use writable CD to get data out of your iMac, you needed to buy an external drive.
You aren't quite right on writable CD being wide spread then--you are early by at least a year or two. When the G3 iMac came out CD-R drives were still above $300, and CD-RW drives were above $450. CD-R discs were around $2 a disc, and CD-RW discs were more like $15-20 a disc. (I'm getting prices from the November 1998 issue of MacWorld).
My recollection is that the usual ways people dealt with the lack of floppy were:
1. External floppy drive.
2. Iomega Zip drive. An external Zip drive suitable for use with the G3 iMac was about $120 when that iMac came out.
3. Ethernet to exchange files with another computer on the LAN that does have a floppy.
That's not correct. Flash usage was trending down fairly rapidly even before that as javascript, css, html5, canvas, and DOM became more feature filled.
Walmart. I've been Amazon Prime for years, but whenever I need to buy something with a high risk of being counterfeit (printer ink is the most common one for me), I use Walmart - and it's free shipping from them anyway. Really the only difference is that Amazon usually gets it to my door faster.
I don't know the details, but Walmart is also moving towards more of being an online marketplace: https://marketplace.walmart.com/
Is the inventory commingled, are the sellers better vetted, is it obvious that you are buying from a 3rd party and not Walmart, all that I don't know. Just pointing this out.
Target.com is okay for now, but supposedly they are going to start going that way also. These days, I look to purchase on the official brand’s website first, or whichever seller they link to on the brand’s website.
To me this is the crux of the issue. And it's non uncommon in software development:
The developer fails to check for an error condition or raise an exception because doing so would add too much complexity to the system. So instead it is assumed (or hoped) that it simply can't or won't happen. Problem solved...
(Edit: Or that the user will just have to reboot if it happens.)
Yes. Not checking for errors is the feature of the MCAT "solution" which hides the system from pilot's training AND involvement with other 727 system/team engineers. A bureaucratic solution to a marketing problem. I wonder how many programers they had to go though to find it.
Tracking time is part and parcel of being a consultant, at least if you have multiple clients and overlapping work. After doing it for 15+ years, I've tried it all - everything from the spreadsheet, to the apps, to forgetting and having to go back and reconstruct.
I read this article and I think it's missing the point about what's so hard about time tracking.
What's hard is: Implementing the trigger on the context switch.
You're working on one thing, something happens and you make a context switch to something else - and in order to track your time, you need a trigger to fire to prompt you to record the switch. It doesn't matter if it's in a spreadsheet or an app or on a piece of paper - I find that my brain doesn't fire that trigger very reliably. Especially if I'm busy.
If someone can solve that problem with a fancy app, I'd be impressed!
I've said it in another thread [1]: I want a robot that watches me and quietly makes intelligent decisions about what I'm really doing, and tracks that.
I was too lazy to figure out what env vars were missing from the cron (probably dbus socket) so i copied them all from the i3 process above
That plus the habit to lock the screen while I'm away from it works fairly reliable.
edit: you also have the idle time in case you want to ignore result where you've been idle for way too long (forgot to lock screen)
edit2: a sample log entry (idle is in miliseconds, date is unix timestamp in seconds)
DATE = 1550608681
IDLE = 2456
WM_CLASS(STRING) = "google-chrome", "Google-chrome"
WM_NAME(UTF8_STRING) = "Edit | Hacker News - Google Chrome"
If only Slack changed the window title when I change chats, I could also track how much time I spend talking where :) The web version does it though, so I might stop using the electron app...
I don't like arbtt because it has an undocumented binary log format making it unnecessarily difficult to build tools on top of it. Its documentation in general is also poorly written.
This is not perfect either, but its just a little extra work to convert it to JSON and put it in elasticsearch to use kibana on it.
I did something similar and found it to be useless for how I work. I even wrote a second tool in Rust that uses the WINAPI (throwback to 1998 when I last used it).
Sure, numbers might be 50% correct, but maybe they're not.
Say I'm supposed to write some code, so the IDE should be the front window. But I get carried away trying to test an edge case, so I spend 4h in a shell doing stuff that's 100% related, but not in the IDE. Not really a contrived example. Or spending 3h in a browser researching something and reading docs and forum posts about $software when I was supposed to write a one liner fix.
Of course I did some post-processing, didn't really help - for me - as I wrote.
But just take the category "browser usage" as an example.
Semi-relatedly, one reason I hate web apps for "persistent" things that should be standalone, e.g. stuff like Slack or E-Mail. Not only does it not fit my mental model with alt-tabbing, it also lumps this uselessly together like "GUI usage vs CLI", so broad is "browser".
Window titles are recorded by this script. I wonder if you noticed this? You could have pretty decent filters with those, e.g. you can get a result for "time spent reading comments and writing on hackernews". If I use slack in the browser, i can even get the time i spent talking to different people / channels.
Couldn't agree more, I also can't reliably track the context switches when contracting. The only thing that works for me is to let my app give me a reminder every few minutes. I used Toggl and set it to 15 minutes. It's annoying most of the time, but it also saves my butt routinely, and is the only thing so far that's worked reliably.
I do exactly the same thing, but when you think about it, isn't this just a pomodoro? You work for 25 minutes. An alarm rings. You take a 5 minute "break". In reality, in that "break" I quickly write down what I accomplished in the last 25 minutes and update my TODO. I also look at my DONE tasks in my TODO list and think about what I was doing and why. I've often found this kind of retrospective to be valuable. I'll notice that there is a better way to accomplish what I'm doing, etc, etc.
As crazy as it sounds, I've even experimented with 5 minute "pomodoros" using this technique - 5 minutes on and 1 minute reflecting. What can you do in only 5 minutes? When I first started it was hard to think in those terms, but as I got better at it, I realised that almost everything I do takes less than 5 minutes. If it takes more, then it's an indication that I need to rethink my approach.
For example, if I'm reading code, it makes sense that it would take more than 5 minutes, so I'll make a goal -- find out how X works. If I'm not finished in 5 minutes, in my 1 minute retrospective I think, "Am I approaching this task in the right way? Is there a better approach?" If no, then the next 5 minutes will be the same as the first. However, I often find that having that break snaps me out of doing unnecessary things.
I can't do the 5 minute thing every day (it is exhausting). I'm dramatically more productive with it, though (surprisingly so). It's made me realise that these kind of enforced reflection periods are really valuable. While you are reflecting, it's easy to write down what you just did, so it's kind of 2 birds with 1 stone.
I'd have to think about the pomodoro thing. Maybe, but I developed an almost unconscious reflex to hit the 'ok' button on the timer to make it go away. I would try very hard to not have it make me think about anything, just confirm which task I was in the middle of. The main thing it caught was when I hadn't re-started a timer after finishing something and stopping it, and when I switched tasks without telling the timer. I'd take a second to fix it, but not stop to reflect, nor break down my tasks. After the first reminder, I'd try to ignore them again.
I found the context switch trigger too hard a problem to solve. The real problem for me was that I found any app that tried to watch me work just too creepy. So then any simple app required lots of manual effort.
I built myself a solution that means I can add events to a calendar that describe my day. Different calendars for different clients and different event titles for each project.
This worked well for me and now I’m trying to build it out and sell it. If you’re interested it’s here: billabl.co. I’ll warn you though, it’s early days and likely to break (although I’ve been using it for years).
The Timing app for macOS (no affiliation) does essentially that, and then displays in a timeline of sorts. When one really needs to track time spent on tasks/projects, a quick after-the-fact look at the timeline makes it easy to spot blocks of "downright coding", "wondering how to do something", etc.
The UI is great for that as well - identify a block that is made up of several 1-minute back-and-forths between browser and IDE, drag across that, and enter task, for example.
100% agree with the trigger being the hard part, and with wanting the observer robot. I know there are partial solutions (RescueTime is a big one) which watch your text editor, or watch your web browser, or suck in meeting data from your calendar, but I've never really been that happy with them.
The further complicating wrinkle for me personally is that I work at a robotics company, so I spend a bunch of time at ssh terminals to remote machines (robots, shared VMs, etc) where it is neither practical nor desirable to install vim plugins hooked up to my personal time tracking setup.
So I'd love for the observer to be able to be able to also watch my remote shell sessions and record things like which file paths I'm editing and commands I'm invoking, from which I could fairly easily construct rules about which general problem area I'm working in.
If you have RescueTime window titles / details enabled for your terminal app, and have configured your terminal app (if it supports it) to promote active shell command to window title, you get this details, regardless of where you are ssh'd to. Works for me at least on macOS + iTerm2.
I feel like it'd be nice to have a foot switch or hardware you can plug in to USB with maybe 5 buttons and an accompanying app. Maybe you can tap these buttons to switch the counter and press the active button again to pause the current counter.
I still feel like some type of foot switch would be better though.
I just gave up on that and use an app that makes it super easy to go back and reconstruct [1]; either a few minutes after the context switch (I just type "-14 Project 2" and it changes the task 14 minutes in the past), or later through a nifty graphical interface.
The provided reports are also great, but if I need anything crazy, I can easily extract the data from the SQLite database.
I’ve stopped doing it reactively and instead take 30 mins at the start of my day to roughly plans out when I’ll be doing things in my calendar.
I get a notification 15 mins before a task change occurs so I can decide either to continue because I’m on a role (often not the case, actually just flailing at a bug) or move on.
If plans change I can usually retrofit my day as the calendar reminds me of the general structure.
It’s worked significantly better for me than reactively tracking my time unless the task length is small e.g. sub 30 mins (something like marking a single students work).
Pomodoro forces a context change, every half an hour. This way I don’t end up yak shaving for half a day when all I needed to do was realise that this solution would require yak hair, go find a different solution.
Rescue Time helps me figure out what I was doing as a kind of forensic tool. There’s heaps of prodding and follow up available in the premium package (apparently), but for me just knowing that I will need to explain to myself why I spent three hours on HN and Reddit today helps me stay away. Mostly.
The Camel book was so well-written. It was my introduction to Perl, which became my "superpower" in the 90's and far longer into the 2000's than I tend to admit. I eventually switched to Python because it's the closest thing that is considered an acceptable "modern" choice. I really enjoy Python too, but the obligatory XKCD about Python[1] rang true for me about Perl first.
For me the #1 superpower strength of both languages is the first-class treatment and syntactic sugar for associative arrays (a.k.a. hashes, dictionaries).
Perl did the same for regexes and file I/O; Python did not.
I have come to appreciate Perl's backwards compatibility -- that old scripts still run unchanged -- though maybe that's largely because Perl 5 has been in maintenance mode for so long.
[1] https://imgs.xkcd.com/comics/python.png