-
Notifications
You must be signed in to change notification settings - Fork 0
/
rss.xml
752 lines (752 loc) · 43.2 KB
/
rss.xml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
<channel>
<title>lusmo.re</title>
<link>https://lusmo.re</link>
<description>Curtis’ homepage</description>
<item>
<title>Stop the Clock</title>
<link>https://lusmo.re/posts/stop-the-clock</link>
<guid>https://lusmo.re/posts/stop-the-clock</guid>
<description>
My watch has this neat feature where it automatically keeps the time and
date synchronised via a radio signal. For the most part it works
flawlessly, and I haven’t had to worry about setting the time in all the
years I’ve had it, even when I accidentally starve it of sunlight to charge
and its battery dies. A short walk outside and it’s back up and running in
no time, back to the correct time again.
But one morning recently I noticed it had started to run about two
minutes fast, and in trying to manually set the time I learnt a valuable
lesson that I think is informative far beyond just my watch.
</description>
<pubDate>Sat, 12 November 2022 00:00:00 GMT</pubDate>
</item>
<item>
<title>A Different Kind of Delivery</title>
<link>https://lusmo.re/posts/a-different-kind-of-delivery</link>
<guid>https://lusmo.re/posts/a-different-kind-of-delivery</guid>
<description>
In my day job I’m a software development consultant, which means I work in
a delivery team and spend a great deal of time working closely with my
product owner to build great software. Outside of my day job, I was
recently part of a big project completely unrelated to software and was on
the other side of the fence, as the (co-) product owner working with a
rather different type of delivery team.
It has been a huge learning experience for me, not just getting the product
owner’s perspective but also observing how delivery teams work in other
industries. In this post I’ll share some of the most important lessons
which I think we can carry across to software development.
</description>
<pubDate>Thu, 12 May 2022 00:00:00 GMT</pubDate>
</item>
<item>
<title>Battles and Wars</title>
<link>https://lusmo.re/posts/battles-and-wars</link>
<guid>https://lusmo.re/posts/battles-and-wars</guid>
<description>
In software there are battles and there are wars. The battles are the
day-to-day—dealing with tech debt, buggy code, flakey build systems,
inadequate testing, unreliable stakeholders, vague and changing
requirements, overbearing processes, the usual stuff. The wars are the
bigger picture—hitting a deadline, delivering a big project,
developing strong relationships, shipping product.
There is an infinite stream of battles. Regardless of whether you win, lose
or surrender, there will always be more battles to fill your day-to-day.
Battles come and go all the time, and they’re always changing. Wars, on the
other hand, play out over a much longer timeframe—it takes time for the
tides of war to change, and you can’t always choose the wars you fight in.
</description>
<pubDate>Fri, 14 May 2021 00:00:00 GMT</pubDate>
</item>
<item>
<title>100 Days of Blogging</title>
<link>https://lusmo.re/posts/100-days-of-blogging</link>
<guid>https://lusmo.re/posts/100-days-of-blogging</guid>
<description>
100 days ago, on 16th January, I started a public blogging streak on
Twitter. At that point, it had been 232 days since my last post and I was
suffering from writer’s block. My goal was not to post every day or even
every week, but just to force myself to make some progress towards a post
each day by thinking of a topic, bashing out a few points in a Twitter
thread, drafting or actually (eventually) posting.
This isn’t my first attempt at an activity streak. I’ve previously written
about my 199 Days of Git, and late
last year I attempted 100 days of meditation publicly on Twitter to mixed
success. In the end, I posted to Twitter on 70 of the 100 days and added
12 posts (including this one) to my blog. Now that it’s come to an end,
it’s time to reflect on the experience, so here are my top five lessons
learnt.
</description>
<pubDate>Thu, 22 April 2021 00:00:00 GMT</pubDate>
</item>
<item>
<title>Code Review</title>
<link>https://lusmo.re/posts/code-review</link>
<guid>https://lusmo.re/posts/code-review</guid>
<description>
I’ve seen a lot of questions recently about code review, so I thought I
would write about my experiences working across a few development teams.
But first, it’s important to remember that code review is but one small
part of a good development process. It’s hard to give advice in general
about code review without considering the whole process.
For example, some people argue that code review is a waste of time because
by the time you review code, it’s already too late to change the design.
The author and reviewer will argue for a bit, but by the sunk-cost fallacy
the author will only commit to minor changes and move on. Some complain
that code review mostly devolves into petty bike-shedding over code style
and formatting. Some complain that waiting for review becomes a huge
bottleneck in the development process.
</description>
<pubDate>Thu, 22 April 2021 00:00:00 GMT</pubDate>
</item>
<item>
<title>When Two Rights Make a Wrong</title>
<link>https://lusmo.re/posts/two-rights-make-a-wrong</link>
<guid>https://lusmo.re/posts/two-rights-make-a-wrong</guid>
<description>
A few years ago I came across this awesome post, How I hacked hundreds
of companies through their helpdesk, which describes a neat hack on a
whole bunch of companies. I encourage you to read the full post because
it’s a fascinating read, but I’ll summarise the gist of it here.
Some work apps, the most common example being Slack, allow you to register
and sign in with any email address on your employer’s domain, e.g.
[email protected]. This is a convenience that allows your employees
to self-service register without allowing just anybody in. This sounds safe
enough to a lot of companies, because they figure they only give out these
email addresses to current employees.
</description>
<pubDate>Thu, 15 April 2021 00:00:00 GMT</pubDate>
</item>
<item>
<title>Lessons from the AFL</title>
<link>https://lusmo.re/posts/lessons-from-afl</link>
<guid>https://lusmo.re/posts/lessons-from-afl</guid>
<description>
The footy is back on again, and I was thinking about what lessons we can
take from team sports, like the AFL, and apply to team environments at work,
like a typical software development team. So in no particular order, here
are ten lessons I think that we in software development could learn from
AFL teams.
</description>
<pubDate>Thu, 8 April 2021 00:00:00 GMT</pubDate>
</item>
<item>
<title>The Perils of Premature Planning</title>
<link>https://lusmo.re/posts/perils-of-premature-planning</link>
<guid>https://lusmo.re/posts/perils-of-premature-planning</guid>
<description>
A few years ago I was consulting with a service delivery team. They had
some manual processes for on-boarding new customers that took two weeks and
they were trying to drive this time down. They knew all the tasks that were
involved, and they used a spreadsheet to plan it all out.
They were trying to switch from this waterfall-ish process to something
more agile, which of course started with adopting an Enterprise-grade Agile
tool like Azure Devops. They had 4 on-boarding jobs in the pipeline, so
they created a backlog and filled it up with eight weeks’ worth of work.
</description>
<pubDate>Thu, 11 March 2021 00:00:00 GMT</pubDate>
</item>
<item>
<title>Scheduling a Weekly Lunch-and-Learn</title>
<link>https://lusmo.re/posts/lunch-and-learn</link>
<guid>https://lusmo.re/posts/lunch-and-learn</guid>
<description>
Early last year, before COVID, I joined an initiative in my squad at work
to boost employee engagement. There were four of us in the group and we
were each tasked with running a series of events for the members of our
squad. I volunteered to organise a monthly lunch-and-learn session at the
office, where each month a member of our squad would present on a topic of
their choosing during our lunch break.
We already had these going on an ad-hoc basis sporadically throughout the
year, usually individually organised by the speaker, but I wanted to make
this a regular event at the office. Unfortunately lockdown struck before we
could run the first session, and so we had to change plans. With everybody
working from home employee engagement felt more important than ever, so we
quickly pivoted to online sessions and we decided to temporarily up the
frequency from monthly to weekly, at least for as long as momentum could
carry us.
Since then we’ve continued to run these weekly, having just passed 41
sessions, and having missed only a handful of weeks due to holidays or
clashes with all-hands. Here’s my top 10 tips for you to try this at your
work.
</description>
<pubDate>Thu, 4 March 2021 00:00:00 GMT</pubDate>
</item>
<item>
<title>Object-capability Model</title>
<link>https://lusmo.re/posts/object-capability-model</link>
<guid>https://lusmo.re/posts/object-capability-model</guid>
<description>
The object-capability model is a really interesting model of programming
that I don’t think is well taught and certainly not well practiced, nor
even encouraged by most modern programming languages.
Think about the concrete actions that your application can take: making a
web request, reading/writing to the filesystem, communicating with another
process like a database, printing to the console, etc. We call these
“capabilities”, and without them a program is basically useless.
</description>
<pubDate>Thu, 25 February 2021 00:00:00 GMT</pubDate>
</item>
<item>
<title>Top-down vs Bottom-up</title>
<link>https://lusmo.re/posts/top-down-vs-bottom-up</link>
<guid>https://lusmo.re/posts/top-down-vs-bottom-up</guid>
<description>
I like to look at the world around me in layers of hierarchy, and there are
two lenses that I apply when thinking about how these layers come together.
The first lens, “top-down”, looks at the world by starting at the top,
something high-level or abstract, and then working down to the lower
layers. The second lens, “bottom-up”, is the opposite—starting with
something low-level or concrete and working up. This sounds pretty
vague, but you can apply these two lenses to pretty much everything, so
let’s explore by looking at a few examples.
</description>
<pubDate>Fri, 19 February 2021 00:00:00 GMT</pubDate>
</item>
<item>
<title>Triggers and Causes</title>
<link>https://lusmo.re/posts/triggers-and-causes</link>
<guid>https://lusmo.re/posts/triggers-and-causes</guid>
<description>
In the tech world, the common wisdom is that when things go wrong we have
blameless post-mortems. The idea here is that preventing the triggering
event from occurring is only part of the solution. The other part, often
the bigger part, is mitigating other factors which cause the event to have
such a large impact. Sometimes it’s not possible to prevent all triggering
events, and we can improve our resilience and reliability more effectively
by mitigating common contributing factors to outages.
We ask questions like, “Can we detect the triggering event sooner?” “Can we
speed up our response process?” “Can we limit the number of people
impacted, or the degree to which they are impacted?” “Can we automate an
error-prone manual process?” “Can we allow a system to self-correct?”
</description>
<pubDate>Tue, 9 February 2021 00:00:00 GMT</pubDate>
</item>
<item>
<title>Redefining Success</title>
<link>https://lusmo.re/posts/redefining-success</link>
<guid>https://lusmo.re/posts/redefining-success</guid>
<description>
There’s an expression in tech that I think is often misunderstood and then
used to justify bad behaviour—“fail fast, fail early”. The idea behind it
is that if an idea is going to fail, it’s better if it fails early, before
you reach the point of the sunk-cost fallacy.
This sounds sensible, and encourages people to build a Pilot rather
than a Season 1, which I think is generally a good thing. But I have
two major concerns with this expression.
</description>
<pubDate>Mon, 1 February 2021 00:00:00 GMT</pubDate>
</item>
<item>
<title>Framing Solutions in Terms of the Problem</title>
<link>https://lusmo.re/posts/framing-solutions</link>
<guid>https://lusmo.re/posts/framing-solutions</guid>
<description>
I was working on a Scrum project where the user stories always ended up
being too big to fit into a sprint, and we were constantly half-finishing
stories and carrying them over to the next sprint. Our team agreed we
needed to split the stories up, but we couldn’t agree how.
The team proposed we split stories into front-end and back-end components.
This is a common way of splitting up work, because it’s obvious, it’s easy
to do, and it’s easy to then assign the smaller stories to those with the
right skills. I proposed instead we use vertical story slicing, where you
slice stories into thin, end-to-end slices, and each slice is fully
integrated and useful to a user. Vertical story slicing could be a post in
its own right, and I won’t go into a full discussion of its merits here.
</description>
<pubDate>Mon, 25 January 2021 00:00:00 GMT</pubDate>
</item>
<item>
<title>Minimum Viewable Program</title>
<link>https://lusmo.re/posts/minimum-viewable-program</link>
<guid>https://lusmo.re/posts/minimum-viewable-program</guid>
<description>
The term MVP, Minimum Viable Product, gets thrown around a lot in our
industry. Some people say MVPs are too small and customer expectations
are higher than ever, and propose instead the Minimum Awesome Product.
Others say MVPs are too big and bloated and still cost too much.
To help people agree on the size and scope of an MVP, I propose the
following simple analogy: Is your MVP a Season 1, or a Pilot? And to
match, an alternative expansion of MVP: Minimum Viewable Program.
</description>
<pubDate>Thu, 21 January 2021 00:00:00 GMT</pubDate>
</item>
<item>
<title>DIY Page Analytics</title>
<link>https://lusmo.re/posts/diy-page-analytics</link>
<guid>https://lusmo.re/posts/diy-page-analytics</guid>
<description>
This site is hosted on GitHub Pages. Because I’d like to have a rough
idea of which of my posts are receiving the most engagement and which
sites are driving the most traffic, and since GitHub Pages doesn’t
provide me with this by default, I decided to add some page view
analytics to my site. I’m not particularly keen on privacy-invasive
services like Google Analytics, which collect far more information than
I need and share it with 3rd-parties, so I decided to build my own
minimalist service. Also, it just seemed like a fun yak-shaving
exercise, and everything else on this page is hand-made.
In this post we’ll walk through how to build a very basic page
analytics service using Azure Functions and Table Storage, which you
can host yourself for a few cents per year—my last twelve invoices
reached a grand total of 49 cents.
</description>
<pubDate>Fri, 29 May 2020 00:00:00 GMT</pubDate>
</item>
<item>
<title>Goldilocks Routines</title>
<link>https://lusmo.re/posts/goldilocks-routines</link>
<guid>https://lusmo.re/posts/goldilocks-routines</guid>
<description>
I hate the lock on my front door. It’s pretty standard. Unlock with a
key from the outside, lock by turning the knob on the inside. Open
from the inside and the door stays locked. Seems pretty simple, so
What’s not to like? If I was capable of following the routine
perfectly, it wouldn’t be so bad. When I get home I unlock the door,
step inside, turn the knob to lock the door, and put my keys down on
my desk. When I leave home I grab my keys from my desk, open the door,
step outside, and the door stays locked behind me.
The problem is that I don’t always follow the routine perfectly. I can
be a forgetful person, and I don’t want to lock myself out by leaving
the house having forgotten my keys. I know that if I’m leaving for work
I’ll never forget to take my bag, so sometimes when I get home I put my
keys in my bag instead of on my desk. But at the same time, I don’t
want to train myself to think “I will never forget my keys because
they’re always in my bag”, because sometimes I leave the house without
my bag, if it’s not for work. This means that every time I leave the
house, I do the dance where I step outside, keep the door propped open
with my foot, and then double-check my bag or pockets for my keys.
</description>
<pubDate>Wed, 20 May 2020 00:00:00 GMT</pubDate>
</item>
<item>
<title>Good Intentions</title>
<link>https://lusmo.re/posts/good-intentions</link>
<guid>https://lusmo.re/posts/good-intentions</guid>
<description>
We make a lot of decisions in software development. Compared to other
fields of engineering, the process of building software relative to
designing it is very rapid, shrinking the time between decisions and
also typically shrinking the time spent on decisions. Modern agile
software development methodology only exacerbates this problem. “Move
fast and break things”.
On top of this, software systems will often stay under active
development for decades, growing to be unfathomably large and complex.
In complex systems decisions in one area often have implications in
other seemingly unrelated areas, making us hesitant to make quick
decisions.
</description>
<pubDate>Thu, 30 April 2020 00:00:00 GMT</pubDate>
</item>
<item>
<title>Meeting Companion: Building a Real-Time Chatroom with SignalR and React</title>
<link>https://lusmo.re/posts/meeting-companion</link>
<guid>https://lusmo.re/posts/meeting-companion</guid>
<description>
In this post we’re going to build a real-time web application with
SignalR and React that lets you create chatrooms and send noises to
each other, perfect as a meeting companion when you don’t want
everybody coming off mute. If you follow along, you’ll be able to build
and deploy your very own copy of Meeting Companion and run it
completely free on Microsoft Azure. All of the code is available in my
GitHub repository. This is a slightly simplified version of another
webapp I built, Soundroom, which can also be found in my GitHub
repository.
</description>
<pubDate>Wed, 22 April 2020 00:00:00 GMT</pubDate>
</item>
<item>
<title>Make it Work, Make it Right, Make it Fast</title>
<link>https://lusmo.re/posts/make-it-work-make-it-right-make-it-fast</link>
<guid>https://lusmo.re/posts/make-it-work-make-it-right-make-it-fast</guid>
<description>
This is an expression originally used to describe a process for
writing code. Make it work—get something, anything, running as
quickly as possible. Make it right—get the program to do what you
want it to. Make it fast—get the program to do what you want it to
fast enough for your needs. What’s important here is the order. If
you do these in the wrong order, you’re gonna have a bad time. The
easiest time to make code compile and run is when there’s barely any
of it and it doesn’t really matter what it does. It’s really hard to
fix bugs in tightly optimised code, because it’s likely a lot more
complicated than it was before you optimised it.
</description>
<pubDate>Thu, 16 April 2020 00:00:00 GMT</pubDate>
</item>
<item>
<title>People and Purpose</title>
<link>https://lusmo.re/posts/people-and-purpose</link>
<guid>https://lusmo.re/posts/people-and-purpose</guid>
<description>
Whenever I interview for a job at a company, there’s one question that
I make sure to ask every single person I can.
What’s the one thing you would miss the most if you left
$COMPANY_NAME?
When I interviewed at Readify, everybody said it was the people. Not in
the “these people are my best friends” sense, although that may very
well be the case, but more importantly in the “this is the smartest,
most passionate, most supportive, most inspiring bunch of people I’ve
ever worked with” sense. Seeing a handful of Readifarians present at
DDD Brisbane in 2017 is what attracted me to Readify in the first
place, so I had a strong feeling this was going to be a common answer
when I was asking the question.
</description>
<pubDate>Wed, 4 September 2019 00:00:00 GMT</pubDate>
</item>
<item>
<title>Take a Step Back</title>
<link>https://lusmo.re/posts/take-a-step-back</link>
<guid>https://lusmo.re/posts/take-a-step-back</guid>
<description>
In my time so far working in software development, as a developer and
as a product manager, I’ve made and seen a lot of mistakes. I spent
some time recently reflecting on some of the biggest mistakes, the ones
that ultimately cost the most time or money, that caused the most
frustration and heartache, and tried to devise some lessons learnt. In
the end I realised that the vast majority of mistakes were actually
variants of the same core mistake, and that one main lesson applied to
all of them.
In this post I will discuss this mistake, some examples of where it
comes up in software development, some thoughts on why it keeps
happening, and some tips on how to avoid it.
</description>
<pubDate>Tue, 9 July 2019 00:00:00 GMT</pubDate>
</item>
<item>
<title>Impostor Syndrome</title>
<link>https://lusmo.re/posts/impostor-syndrome</link>
<guid>https://lusmo.re/posts/impostor-syndrome</guid>
<description>
What do a junior and a senior developer have in common? They both
constantly feel like they have absolutely no idea what they’re doing.
What’s the difference between a junior and a senior developer? The
senior developer knows that this is completely normal. One of the
things about programming is that if you’re doing something you’ve
done before, you’re usually doing it wrong. And by this I mean that if
you’re trying to solve a problem you’ve solved before, you should just
reuse the solution from last time.
We’re lucky in the world of software that we can do this, but one of
the consequences of this is that most software development is almost by
definition something that has never been done before, at least by you.
If you work in software, you’d better get used to this feeling. It’s
easy to look at all the people around you at work or in the community
and the great work that they do and think they must know what they’re
doing. “These people are real developers, I’m just an impostor. One day
they’ll all realise I am completely out of my depth and I’ll be fired.”
This feeling is so common that it has a name—impostor syndrome.
</description>
<pubDate>Thu, 7 March 2019 00:00:00 GMT</pubDate>
</item>
<item>
<title>Computer Science as Exploration</title>
<link>https://lusmo.re/posts/computer-science-as-exploration</link>
<guid>https://lusmo.re/posts/computer-science-as-exploration</guid>
<description>
What is computer science really about? In the present day, despite
being such a relatively young and immature field, computer science
employs millions of people all over the world, it produces the
technologies that run our lives, and it is responsible for countless
billions or trillions of dollars of value. Even going into the
near-term future, the software that has been built over the last few
decades will continue to affect the daily lives of people for
generations to come.
But to me, that’s just commercial success. At the end of the day, or
perhaps better to say at the end of the millenium, will anybody really
care? If we made contact with an alien race, would we brag about our
ability to share cat photos with millions of strangers, or even our
ability to build billion dollar companies? There must be some deeper
meaning to this all. I can feel it. When I’m programming or problem
solving, I feel like I’m exploring. But what am I exploring?
</description>
<pubDate>Sun, 24 February 2019 00:00:00 GMT</pubDate>
</item>
<item>
<title>Accidental Agility</title>
<link>https://lusmo.re/posts/accidental-agility</link>
<guid>https://lusmo.re/posts/accidental-agility</guid>
<description>
Today marks the 18th anniversary of the final day of the meeting at
Snowbird which ultimately lead to the creation of the agile software
development manifesto. If it were a person, it’d be at the legal
drinking age (here in Australia). And it has a lot to celebrate, it’s
come a long way in that time. What started as scribblings on a
blackboard in a meeting of seventeen programmers has since grown to
take the business world by storm. Some would even say it’s grown out of
control (some of the original authors, no less).
In this post, I want to rediscover the essence of agility by looking
at an example of an industry that exhibits the principles outlined in
the original manifesto, despite not even being aware of it. This
essentially means that they have independently discovered the ideas of
agile development, but because they missed the surrounding hype,
they’ve managed to avoid a lot of the unnecessary baggage that tends
to follow “Agile” in practice. My goal is to make people refocus on
what is really important and valuable about agile software development,
and see past the noise that has built up around it.
</description>
<pubDate>Wed, 13 February 2019 00:00:00 GMT</pubDate>
</item>
<item>
<title>Find a Purpose: My Journey, Part 2</title>
<link>https://lusmo.re/posts/find-a-purpose</link>
<guid>https://lusmo.re/posts/find-a-purpose</guid>
<description>
I continued building tiny, incomplete games with Game Maker for a
couple of years, never really making anything substantial but still
learning a lot. And while I was enjoying the act of making games, and I
certainly enjoyed playing games, I didn’t really enjoy playing my
games. Partly because they weren’t very good, but also because I knew
how they worked, how to beat them, and I didn’t get the same feeling of
discovery that I got playing other games. And as the enjoyment of
playing the games diminished, so too did the enjoyment of making them.
I wasn’t sure whether I should be programming for the sake of
programming, or programming for the outcome.
At the same time, I was spending a great deal of time playing an online
game, which will remain nameless. The client for playing this game had
an IRC chat window below the main game window, which I would use to
chat with my friends while playing. One of my friends was also a
programmer, and he knew how to make IRC bots. If I recall correctly,
his bot simply helped administer the channel—it would grant certain
users permissions when they joined, kick people out when they broke the
rules, it could even run a little trivia game. It didn’t do anything
terribly exciting, but I could see the potential.
</description>
<pubDate>Wed, 6 February 2019 00:00:00 GMT</pubDate>
</item>
<item>
<title>The First Great Epiphany: My Journey, Part 1</title>
<link>https://lusmo.re/posts/the-first-great-epiphany</link>
<guid>https://lusmo.re/posts/the-first-great-epiphany</guid>
<description>
My first exposure to programming was some time around the turn of the
century with a program called Game Maker, which as the name suggests,
was built for making games. Game Maker actually supported a decent
amount of graphical programming by dragging-and-dropping icons around
the screen to describe the behaviour of different objects in the game,
but as soon as I learnt that there was another way to do it that had
more features, I wanted to learn that.
The tutorial for the scripting language in Game Maker at the time
walked you through programming a little game similar to Space Invaders,
where you controlled a space ship at the bottom of the screen and the
goal was to shoot the enemy ships approaching from the top of the
screen. I followed the instructions closely, typing in all the code it
supplied to define the behaviour for moving and shooting, including a
cooldown for the gun so that you wouldn’t just fire off a shot every
game tick. And then they gave you an exercise, to add a second weapon
to the ship that was triggered from a separate key and that had its own
cooldown. And I was stumped.
</description>
<pubDate>Sun, 3 February 2019 00:00:00 GMT</pubDate>
</item>
<item>
<title>Multiple Git Profiles</title>
<link>https://lusmo.re/posts/multiple-git-profiles</link>
<guid>https://lusmo.re/posts/multiple-git-profiles</guid>
<description>
If like me, you need to make Git commits from multiple email addresses
on the same machine (say, from your personal and your work address),
here’s a handy trick that will help make sure you make every commit
with the right address.
Start by creating a directory for each profile, named after the
profile. In my case, I have D:/git/home and D:/git/work. Move all your
Git repositories into the directory corresponding to the profile that
you want to use when making commits to that repository. At the root of
your profile directories, create a .gitconfig file with the following
content.
</description>
<pubDate>Thu, 31 January 2019 00:00:00 GMT</pubDate>
</item>
<item>
<title>Programming by Wishful Thinking</title>
<link>https://lusmo.re/posts/programming-by-wishful-thinking</link>
<guid>https://lusmo.re/posts/programming-by-wishful-thinking</guid>
<description>
This is a technique that I discovered several years ago while teaching
an introductory programming course, and I was extremely pleased to find
out that although it had already been discovered, I had given it the
same name. Programming by wishful thinking is a style of top-down
program design that helps you improve the structure of your code,
isolate the hairy parts from the simple parts, think more clearly about
data flow, and work faster. I find it particularly helpful for novice
programmers who feel intimidated when starting a new project and aren’t
sure how to get started, but I still practise it regularly as well.
</description>
<pubDate>Mon, 21 January 2019 00:00:00 GMT</pubDate>
</item>
<item>
<title>Diagnostics Anonymous</title>
<link>https://lusmo.re/posts/diagnostics-anonymous</link>
<guid>https://lusmo.re/posts/diagnostics-anonymous</guid>
<description>
When working with large systems, especially with software, inevitably
something will go wrong and you’ll be stuck trying to diagnose it. My
years of developing software have given me a lot of practice diagnosing
errors or unintended behaviour in software systems (usually in my own
code), and over time I’ve built up a systematic process that I run
through to speed up the process. In writing this post, I came to
realise that my process actually has quite a lot in common with 12-step
programs, so I’ve tweaked the format a little to make the content a
little more interesting.
</description>
<pubDate>Mon, 4 December 2017 00:00:00 GMT</pubDate>
</item>
<item>
<title>Imitating Classes</title>
<link>https://lusmo.re/posts/imitating-classes</link>
<guid>https://lusmo.re/posts/imitating-classes</guid>
<description>
In this post, we are going to explore how you might imitate classes
in a language that doesn’t have them, to get a better feel for how
various object-oriented language features actually work. We will use
JavaScript, but ban ourselves from using
the class keyword (obviously),
the new keyword (we will construct all of our own objects),
the this keyword,
prototypal inheritance (we will build our own inheritance mechanism).
</description>
<pubDate>Mon, 13 November 2017 00:00:00 GMT</pubDate>
</item>
<item>
<title>The Freedom of Restrictions</title>
<link>https://lusmo.re/posts/the-freedom-of-restrictions</link>
<guid>https://lusmo.re/posts/the-freedom-of-restrictions</guid>
<description>
One of my great joys when designing things is when I discover that I
can lift a restriction and make something both simpler and more
powerful at the same time. This can happen at all levels, from
something like changing a function signature to make it more generic,
right up to unifying high level system components. The more generic
something is, the more situations you can use it in, and the more value
it can provide.
</description>
<pubDate>Mon, 26 December 2016 00:00:00 GMT</pubDate>
</item>
<item>
<title>What’s in a Language?</title>
<link>https://lusmo.re/posts/whats-in-a-language</link>
<guid>https://lusmo.re/posts/whats-in-a-language</guid>
<description>
A programming language is an interface between humans and computers,
that allows us to program computers to perform some task. The purpose
of the task is usually to solve some particular problem that the human
has. Most languages are Turing complete, which essentially means that
they are mostly all equivalent. So what’s the point of creating a new
programming language if it’s equivalent to ones that already exist?
Turing completeness means that languages are equivalent in terms of the
programs they are able to express, but it says nothing about the
journey of getting to the finished program.
</description>
<pubDate>Tue, 6 September 2016 00:00:00 GMT</pubDate>
</item>
<item>
<title>199 Days of Git: Reflections on Git streaking</title>
<link>https://lusmo.re/posts/199-days-of-git</link>
<guid>https://lusmo.re/posts/199-days-of-git</guid>
<description>
May 20, 2016. My Git streak comes to an abrupt end on 199 days. Today,
GitHub disabled the commit streak feature and left me stranded one day
short of a milestone. It feels a little frustrating to get so close and
then have it taken away, but in the end the overwhelming feeling is
actually one of relief.
I’m a chronic procrastinator and a prolific sidetracker—I’ve always had
trouble following through on things after the initial whirl of
enthusiastic development dies down. More often than not, it’s not so
much that I get bored of the project I’m working, it’s that I get
distracted by something else more exciting. I’ve tried lots of
different approaches to improve this, but haven’t had much success.
</description>
<pubDate>Fri, 20 May 2016 00:00:00 GMT</pubDate>
</item>
<item>
<title>Trust Nobody, Not Even Yourself</title>
<link>https://lusmo.re/posts/trust-nobody-not-even-yourself</link>
<guid>https://lusmo.re/posts/trust-nobody-not-even-yourself</guid>
<description>
Trust the programmer
This phrase is part of the C philosophy, and has influenced the design
of many programming languages. In general C usage, this is best
observed by the use of pointer casts—a mechanism by which the
programmer can bypass the type system, trading compile-time type safety
for flexibility and potentially incurring fatal crashes at run-time.
The phrase needs little explanation—the programmer knows what they’re
doing, don’t get in their way.
</description>
<pubDate>Sat, 7 May 2016 00:00:00 GMT</pubDate>
</item>
<item>
<title>Why Static Isn’t Real Sharing</title>
<link>https://lusmo.re/posts/why-static-isnt-real-sharing</link>
<guid>https://lusmo.re/posts/why-static-isnt-real-sharing</guid>
<description>
The static keyword has origins as far back as C, and has carried across
to C++, Java and C#, among others—although its meaning has changed a
bit along the way. In C# and Java, one of the common uses is for
class-level sharing of members. Static members don’t belong to any
instance, and can only be accessed directly from the class or from
another definition in the same class.
And this is all well and good for sharing within a class, but the
problem is that it doesn’t play well with inheritance, because static
members cannot be overridden. And inheritance is another common method
of achieving code sharing. Consider the following snippet, which shows
how one might hope to override static members in C#.
</description>
<pubDate>Fri, 8 April 2016 00:00:00 GMT</pubDate>
</item>
<item>
<title>Intuition of Church Encoding</title>
<link>https://lusmo.re/posts/intuition-of-church-encoding</link>
<guid>https://lusmo.re/posts/intuition-of-church-encoding</guid>
<description>
After first being introduced to the concept of Church numerals in
Structure and Interpretation of Computer Programs, I decided to learn
more about them and the more general topic, Church encoding. For those
who don’t know, Church encoding defines a way to represent common data
types and structures in the Lambda calculus using only functions, since
functions are the only terms available.
I eventually stumbled upon a pretty neat intuition for how Church
encodings work, which enables you to create encodings for arbitrary
data types very easily. But first, a little on how I got there…
</description>
<pubDate>Sat, 26 March 2016 00:00:00 GMT</pubDate>
</item>
<item>
<title>Pre-processing Imports in Python</title>
<link>https://lusmo.re/posts/pre-processing-imports-in-python</link>
<guid>https://lusmo.re/posts/pre-processing-imports-in-python</guid>
<description>
Inspired by David Beazley’s talk on various hacks that can be made to
Python’s import system, I whipped up the following script for running
a preprocessor over a file at import-time. In most cases, I would say
this is far from a good idea, but it might be useful for creating small
domain-specific languages, or defining new literals, or something like
that.
</description>
<pubDate>Mon, 27 July 2015 00:00:00 GMT</pubDate>
</item>
<item>
<title>Multiple Dispatch in Python</title>
<link>https://lusmo.re/posts/multiple-dispatch-in-python</link>
<guid>https://lusmo.re/posts/multiple-dispatch-in-python</guid>
<description>
I recently read Functional Programming in Python which mentions a
library which adds multiple dispatch to Python. One of my biggest
hobbies is creating things from scratch, as it really helps me get a
better understanding of how they work, so I thought I’d see if I
couldn’t figure out how to do it myself.
</description>
<pubDate>Sat, 25 July 2015 00:00:00 GMT</pubDate>
</item>
<item>
<title>Programming Languages for Beginners</title>
<link>https://lusmo.re/posts/programming-languages-for-beginners</link>
<guid>https://lusmo.re/posts/programming-languages-for-beginners</guid>
<description>
What’s the best/easiest programming language to learn for a beginner?
I see this question asked all the time. Usually asked by people who
want to get into programming, or maybe they’ve just finished learning
the basics in their first language and are thinking about where to go
next. It’s an innocent enough question and usually asked with good
intentions, but it still bugs me every time I see it.
</description>
<pubDate>Sat, 6 December 2014 00:00:00 GMT</pubDate>
</item>
</channel>
</rss>