Results: 37
-
The Principles of Product Development Flow
2023-08-24 17:43
- 202309011312 The primary goal in product development is to make good economic decisions
- 202309011322 We need more information for complex decision making
- 202309011327 Define metric to value transfer functions using sensitivity analysis
- 202309011333 Quantify your cost of delay
- 202309011342 Measure output instead of activity
- 202309021620 Important trade-offs have u-curve optimizations
-
The Software Craftsman
2023-12-09 13:23
Chapter 2 - Agile
- 202312161343 You don’t do Agile
- (18 discussion) “Focusing purely on the process and treating software development like a production line leads to average 9-to-5 developers doing what they are told — they become factory workers.” This is what we do here with mobbing
- (19 discussion) bad faith argument in paragraph 2
Chapter 3 - Software Craftsmanship
-
Joe the Axolotl, Clever Closet, & Demonic Robots
2024-05-03 15:30
- Anyone can start a girls who code club and if you have enough people sign up, you can get free resources like lessons, notebooks etc.
- Dept of Ed standards alignment
- 7x more likely to go into STEM than national avg
- She led the Otterbein one, it does something a little different than the provided web lessons
- Build things “clever closet” and others (had never seen clueless so they thought it was original which is cool)
- Pololu 3 Pi Robots pre-built 4 AAA batteries, hokey pokey robot, Rube Goldberg machines, etc
- LEGO Robots now, loved those
- Game dev
gwcotterbein@gmail.com afholcomb72@gmail.com @gwcotterbein insta
-
Have a single source of truth for invariants
2023-12-09 14:34
Every piece of knowledge must have a single, unambiguous, authoritative representation in your system.1
Even though I do not generally like the DRY principle because of its over-generalization, misdirection, and ease of misuse (202204262054 Prefer duplication over the wrong abstraction), I do think that it can be helpful when discussing sources of truth.
For instance, an application should only have one authoritative way to get an object or model where important invariants and business rules can be housed. Then we know that everyone who's making a new user or something will have e.g. the same validation requirements.
-
Thomas, D., & Hunt, A. (2019). The pragmatic programmer, 20th anniversary edition: Journey to mastery (Second edition) (pp. 31). Addison-Wesley. ↩
-
-
The Myth of Sisyphus
2024-06-13 17:15
The fundamental subject of The Myth of Sisyphus is this: it is legitimate and necessary to wonder whether life has a meaning; therefore it is legitimate to meet the problem of suicide face to face. The answer, underlying and appearing through the paradoxes which cover it, is this: even one does not believe in God, suicide is not legitimate. Written fifteen years ago, in 1940, amid the French and European disaster, this book declares that even within the limits of nihilism it is possible to find the means to proceed beyond nihilism.
– Albert Camus, Paris, March 19551
-
Camus, Albert, and Justin O’Brien. The Myth of Sisyphus. Second Vintage international edition. New York: Vintage International : Vintage Books, a division of Penguin Random House LLC, 2018. ↩
-
-
Seven habits of highly effective people
2021-06-22 17:13
The seven habits of highly effective people are described in the eponymous book by Stephen R. Covey.[^covey2004] Covey discusses how people can see the same things and have different perspectives. He also discusses how maturity is a continuum that can be describes as moving from dependence to independence to interdependence.
An observation: 202109251019 Highly effective people are leaders.
Circles of Influence
Maturity Continuum
- 202109121550 Maturity of dependence
- 202109121536 Maturity of independence
- 202109121530 Maturity of interdependence
The Seven Habits
Habits for building independence
- 202106241529 Be proactive
- 202106221744 Begin with the end in mind
- 202106241528 First things first (Covey uses the 202106241531 Eisenhower matrix of task value as an example of how to define what should be put first)
Habits for interdependence
- 202106241527 Think win-win
- 202106241526 Seek first to understand, then to be understood
- 202106241525 Synergize
Habits for continual improvement
-
Understanding How Your CPU Thinks
2024-05-03 11:00
- Two most important skills for a developer
- Break problems into smaller problems
- Communication (with people and with the computer)
- Talked about pipelining
- increases µops throughput
- think about doing multiple loads of laundry in washer and dryer
- f# nice
- this point was a little off from my understanding of schedulers and the term "pipelining" specifically.
- Caches and different memory locations: registers, L1, L2, L3, RAM, DISK etc.
- Don't use 0V–1.3V and 3.7V-6.3V anymore for memory and heat efficiency. They've shrunk those voltages and tolerances.
- Got into machine code and micro-ops for assembly
- Importantly, the op and params and everything are all encoded.
- This is why ARM ops have variable bit sized parameters. They're all encoded into 32 bit instructions, so the specifics of the encoded instructions/params might change the available bits for parameter store.
- Showed the circuit for a 4 bit adder, arbitrarily chainable for higher bits, 32/64.
- youtube videos:
- domino computing by standupmaths
- water computer steve mould
- how to do multiplication
- f# "Freestylecoding.Math" bit math lib
- interesting idea of returning division with remainder as tuple with
/%
operator
- youtube videos:
- Two most important skills for a developer
-
The Art of Doing Science and Engineering
2022-05-09 21:34
An excellent book by Richard Hamming on doing science, 202203210833 Systems thinking, 202208131327 System design, and having 202205231312 A Career.[^hamming2020]
- 202207271527 An order of magnitude of change produces new effects
- To the extent you can choose, work on the problems that you think will be important (202206112310 Work on what matters).
- 202207271530 Expertise is required to create useful simulations
- 202207271958 Stability or instability dominates a system
- 202207272000 Garbage in, garbage out
- 202208211340 Users can affect the validity of simulations
- 202208211331 Simpson's paradox
- 202208211352 There is no shortcut to learning
- 202208211358 Hawthorne effect
- 202208211404 Learning to follow and learning to lead
- 202208211426 Work with people who know they don't know
- 202211031026 The unreasonable effectiveness of mathematics
- 202211030958 Creative accomplishments happen over time
- 202110251122 Analogy is a highly effective communication method
- 202304031221 Breadth of knowledge fuels analogy
- 202308271108 Construct hooks for future knowledge
- 202304041100 Learn, don't memorize
-
The Entry Point
2021-04-29 15:22
#new #thread #source #structure #wip
This is the main entry point into my knowledge graph. At the risk of being prescriptive about categories and connections, a single top-level entry point is useful to maximize discoverability. If you're looking for other things I do, check out my home page.
The lofty goal of this project is to contain all of my knowledge. I hope this will be a lifelong project where I can learn, collect, and create a record of my thoughts in a simple, plain-text format that should never become obsolete.
Workflow
This will change drastically over time, but in an effort to keep myself organized, here's my process.
- Find a source of information
- Create a #source note with solid citations (managed in Zotero) for taking notes while consuming the source.
- Create, link, and manage the Zettel and my Zettelkasten.
For more information on the why and how of using a Zettelkasten, see 202107272242 The Art of using a Zettelkasten.
Tags
- The #structure tag is used for structure notes. These are hubs of Zettel that are connected under some sort of idea. They help with discoverability and maintenance of the Zettelkasten as a whole.
- The #source tag is a single Zettel to organize the notes I take while working through some source material. Each Zettel that's a #source is also a #structure Zettel. For example, I take notes while reading a book in a Zettel that's named for the book's title and tag it with the #source tag. These notes aren't technically needed if we do a good job citing sources, but it's helpful during the initial reading and note taking for long-form content that requires multiple sessions.
-
Thinking in Systems
2024-01-29 14:11
- 202401291425 Definition of system
- 202401291441 Systems thinking benefits all thought
- 202401291458 The purpose of the parts may not be the purpose of the whole
- 202401291554 All systems thinking is a simplification
- 202308281423 Ship of Theseus
- 202205021252 Stock and flow
- 202110231515 Feedback loop
Chapter 2 - A Brief Visit to the Systems Zoo
- One Stock Systems
- 202402171439 One stock with two competing balancing loops
- 202402171455 Feedback can only affect future behavior
- 202402171507 A stock with one reinforcing loop and one balancing loop
- 202402171512 The principle of shifting dominance
- 202402171520 Ask questions to assess the validity of a model
- 202402241530 One stock with delays
- Two Stock Systems
Chapter 3 - Why Systems Work So Well
-
Stir Trek 2024
2024-04-30 10:34
Selected Sessions
time room rank speaker track session 08:45 could not attend -
The Private Library
Being a More or Less Compendious Disquisition on The History of the Architecture and Furnishing of the Domestic Bookroom
2024-07-28 12:42
The Private Library is the domestic bookroom: that quiet, book-wrapt space that guarantees its owner that there is at least one place in the world where it is possible to be happy. The history of its architecture and furnishing extends back almost to the beginning of history and forward toward a future that is in equal parts amazing and alarming.
All libraries are magical rooms. All their windows look out onto Faërie, and all their carpets can fly. […] Entering our library should feel like easing into a hot tub, strolling into a magic store, emerging into the orchestra pit, or entering a chamber of curiosities, the club, the circus, our cabin on an outbound yacht, the house an old friend. It is a setting forth and a coming back to center. [^byers2021] (pp. 1, 3)
A visitor standing before this instantiation of language must have felt the true, right sense of the numinous.[^byers2021] (pp. 14)
A private library is a place for rest and relaxation, but also contemplation and thought. It is a place for the individual to find respite and transport oneself to new worlds. In its purest form, a library is only a library if that is its sole purpose. A study or an office can have many of the qualities of a private library but it may not truly be one if it can’t provide the enveloping nature of a pure library.
-
System design
2022-08-13 13:27
Designing systems is one of the common, critical tasks of a 202206112233 Staff-plus engineer. It's something that sets a 202206112236 Senior engineer apart. It proves that you can understand tradeoffs in technology and organizational size and maturity. It shows that you understand how to build things that are optimal for now and have a clear path to the future you're working toward. Many engineers plateau at a place where they can understand and implement any type of tech but aren't capable of planning out new systems from scratch based on some need of the business.
Example systems to learn how to design
- Rate limiter
- Consistent hashing
- Key-value store
- Unique id generator in distributed systems
- Url shortener
- Web crawler
- Notifications
- News feed
- Chat
- Search autocomplete
- YouTube
- Google Drive
Example: Scale from 0 to 1M users
- start with a single server. DNS somewhere directs all traffic to the web server where everything from apps, to APIs, to DBs are housed.
- The first interesting scale point is when you need to separate your database from your web servers. At this point you probably have enough reason to discuss the exact details of the DB you're using. Should you be using a relational DB or a NoSQL document store?
-
Essential XP Emergent Design
2024-06-27 12:56
An article we read as a group for a discussion in our engineering organization. The author explicitly offered all his conclusions as fact "without much justification" noting that "at some later time, perhaps I’ll try to justify this view."[^jeffries2001] I did not agree with what little it did contain.
There are many well-known modeling and design techniques that can be used to bring about a "good design". An incremental process may limit the applicability of these techniques, which are most powerful when applied and committed to "up front". Test everything; eliminate duplication; express all ideas; minimize entities: These few simple rules, applied locally, can help a high quality global design to emerge.[^jeffries2001]
Ron asserts that good design is highly modular, consisting of separate components (typically objects) which are highly cohesive, loosely coupled, and given expressive names that enable us to grasp quickly what the modules mean and why they are there.[^jeffries2001] This statement is the most reasonable of the article. I agree with it, but I find it to be vague to the point of being unhelpful. For example, I'd rather be the right temperature than very hot or cold, but that doesn't offer much as to the nature of "the right temperature". Being the right temperature is tautological. His design principles aren't as self-evident, but they can be interpreted in almost any way to fit or reject a design as "good".
-
Types, and why you should care
2022-06-28 14:49
From a talk[^minsky2019] by Yaron Minsky of Jane Street.
Typed vs. Untyped
- Untyped — scripting, lightweight, friendly, and slow.
- Typed — Serious, professional, unfriendly, verbose, and fast.
Some definitions
- Values — data, things
- Variables — can be different values, part of the lexical portion of the language
- Expression — composed out of variables, values, and other things
- Types — categorization system for values; groups values into named groups; strings, integers etc.
- In untyped language, values have types
- In typed languages, values, variables, and expressions all have types. (For instance, variable is typed when it always contains a variable of that type)
Why types?
- Make programs faster, typically through compilation/interpretation loop having “hints” and more information.
- V8 for instance can be super fast, within a factor of 3 or so from a compiled language (but this is through herculean effort of thousands of people over tens of years and complicated things like tracing compilers and things)
- This is predictable performance vs V8
- Make programs more understandable
So why don’t people always use them?
- Often make programs more verbose — when the language doesn’t have a convenient way to express something, it’s difficult to express it at all or in a good way
-
Curriculum design for software engineering
2022-06-28 20:18
I want to teach computer science, what should I do?
vs
I want to make software, what should I do?
Need to ask questions about the desired solution to figure out things like goals, constraints, and methods before you can build that solution. In the education case, the “solution” is the curriculum.
Ask things like:
- What age are the students?
- What exposure have they had before?
- Is this required? An elective? An extracurricular?
- How long is the class? How often does it meet?
- Is it even a class or something else?
- How many students are in the room?
etc. but also think about things like
- Is there internet access?
- Is the teacher new to programming?
- Can the students type?
- Are there students with disabilities?
- Do the students have regular computer access at home?
- Do the students have regular computer access at school?
Think about
- Equity, Rigor, and Scale
Methods
- Required courses
- Don’t scale though, need certifications for teacher. The economy for experts means that they’ll go to Jane Street and learn a huge amount more than public HS
- Rigor has to take a hit because everyone has to pass the course to graduate
- Elective courses
- Not equitable. Hugely biased (currently) to white and asian males, failures and achievement gap #thread lead to further disparity.
-
The Pragmatic Programmer
2023-07-24 10:42
Intro
- 202308141544 Make the future less painful
- 202308281423 Ship of Theseus
- What makes a pragmatic programmer?
- 202308271610 Quarry workers' creed
Chapter 1
- 202308282340 No broken windows
- 202312091400 Be the exemplar of change
- 202312091413 Know what's good enough
- Think critically
Chapter 2
- Good design is easier to change than bad design. Almost all other patterns boil down to "easier to change" or ETC or 202205031449 Optimize for change or 202204262114 Write code that's easy to delete, not extend.
- This is a value (spectrum) not a rule.
- This is why I don't like frameworks that lift a lot (tailwind style string classes everywhere in code) or rails magic. It's everywhere and pervasive and not good. Or things w/lots of non-standard tooling (bit or graphql)
-
Minimum Viable Replacement
2024-05-03 14:00
About 100x as long as needed and poorly written. Did not even introduce a “framework” in the end, literally just set up the problem and ended with GLWTS. But the slides are good.
The problem: Replacing an existing system is the exact opposite of an MVP
If you’re trying to retire a legacy platform — instead of having the luxury of just solving very specific customer segment needs — you need to solve the needs for every customer segment using your software! [...] Instead of trying to solve the needs of just one small segment, you now have to deliver 20 years worth of software development for thousands of customers across multiple countries and segments to retire the system [...] Consequently, we need to prove that the new technology matches or exceeds the value of the old technology for our existing customer base.
Retiring systems takes longer and costs more than your executives want to hear
Stir Trek Talk
- Charlie Brown kicking the ball, but yet we think it’ll work this time
- Turns into deadline driven development
- Problem is that expectations are out of alignment with reality
- Ignore laggards and edge cases but laggards are biggest customers and edge cases are your critical risks
-
As We May Think
2021-09-08 08:47
#structure #thread #source #new
A seminal essay on machine augmented thinking written by Vannevar Bush in 1945.[^bush1945]
He urges that men of science should turn to the massive task of making more accessibly our bewildering store of knowledge. For years inventions have extended man's physical powers rather than the powers of his mind. [These inventions] are new results, but not the end results, of modern science. Instruments are at hand which will give man access to and command over the inherited knowledge of the ages. The perfection of these pacific instruments should be the first objective of our scientists as they emerge from their war work. Like Emerson's famous address of 1837 on The American Scholar this paper calls for a new relationship between thinking man and the sum of our knowledge.
Consider a future device [...] in which an individual stores all his books, records, and communications, and which is mechanized so that it may be consulted with exceeding speed and flexibility. It is an enlarged intimate supplement to his memory.
Knowledge evolves and endures throughout the life of a race rather than that of an individual
Publication of research has been extended far beyond our present (1945) ability to make real use of the record.
-
Category Theory in Life
2022-07-18 19:46
Category theory is abstract, but its abstraction makes it apply to many things around us in ordinary life.
What is category theory?
Category theory is the mathematics of mathematics
Mathematics is the logical study of how logical things work.
In order to study things logically, we have to ignore some details of reality that make things behave illogically. It's only in the abstract world where things do behave perfectly logically
Category theory is the logical theory study of the logical study of how logical things work.
The map of the London underground is a good example of a "mathematics", where the geographical map of the exact tubes are not the purpose. The slightly unreal, more representative version helps us in a certain situation navigate more easily. We choose to ignore certain details to represent things more logically.
Objects and morphisms
$A \rightarrow B$ means there's a $morphism$ between $A$ and $B$.
So if we have
$$A \xrightarrow{\text{is the mother of}} B \xrightarrow{\text{is the mother of}} C$$
We can deduce
$$A \xrightarrow{\text{is the grandmother of}} C$$
Instead of looking at things based on their intrinsic characteristics, we can learn a lot about them (and other things) by their relationships to other things: hence the "Category". This gives us more context
-
The solitude of leadership
2021-12-20 13:17
People think leaders are individuals with others looking to them for direction. People think solitude is something like Thoreau, alone at Walden Pond. What could solitude have to do with leadership?
Leadership is the qualities of character and mind that will make you fit to command a platoon or a company, a battalion or a corporation, a foundation, a department, a government.
Solitude is the ability to be alone with your thoughts.
Solitude is therefore one of the most important necessities of true leadership.
On the mistaken idea of making it to the top means you're a leader
Many people can be energetic, accomplished, smart, or ferociously ambitious, but is that enough to make them leaders? No. These types of things are encouraged and developed in our generation of world-class hoop jumpers — they're "excellent sheep". Many institutions that talk about leadership are really talking about this. They're talking about educating people to make big names for themselves with impressive titles that they can brag about. They're talking about training people to climb the greasy pole of whatever hierarchy they decide to attach themselves to. But this idea is wrong and dangerous.
-
Remote team management
2021-10-22 08:45
This structure note records my learnings from taking the Coursera How to Manage a Remote Team course.[^murph2020] These notes come from a time before my Zettelkasten and are longer, more verbose, and less atomic than I'd normally like, but I'm just going to leave them as they are. That way, I can link to them and search for their contents without investing the time in breaking them down more.
Managing a team of remote workers presents unique challenges and opportunities:
Communication is Crucial
Embracing Asynchronous Communication
In a world dictated by calendars and schedules, people are conditioned to operate in synchronicity — meaning that they inhabit the same physical or virtual space at the same time. Asynchronous communication is the art of communicating and moving projects forward without the need for collaborators or stakeholders to be available at the same time your message is sent.
In an all-remote setting, mastering asynchronous workflows is vital to avoiding dysfunction and increasing efficiency. The benefits include enabling your team to work effectively across time zones, reducing meetings, and enabling team members to work on a flexible schedule — all of which raise morale and productivity. However, shifting to this way of working requires a lot of large and small adjustments.
-
A renewable stock constrained by a non-renewable stock
2024-02-24 15:36
An interesting two-stock system arises when there is a renewable stock constrained by a non-renewable stock. This system differs from one-stock systems because it is constrained by its surroundings. An example of this type of system is an oil economy. The non-renewable stock of oil, its production, and its long-term availability constrains the stock of capital in the industry. Investment — a renewable source of capital — and oil extraction and sales increase the capital of the oil industry, but the non-renewable availability will eventually limit the growth of that capital to the point where no investment will happen and the industry will dry up when oil is gone.1
-
Meadows, D. H., & Wright, D. (2011). Thinking in systems: A primer (Nachdr.) (pp. 60). Chelsea Green Pub. ↩
-
-
The fastest code is no code
2022-04-27 22:19
It’s impossible for any line of code, no matter how fast and well written to be as performant as no line of code. There are two points here.
From a performance perspective, we obviously only want to do the work that’s absolutely essential. We want to optimize the source code and execution paths to be as minimal as possible.
From a philosophical perspective, we want our code to be simple and minimal, although there’s more leniency in this point than the performance one. Less code written is less code we have to read and less we have to understand: minimizing the amount of code minimizes what we have to reason about and maintain. Importantly though, we also want to make that code maximally understandable. We want to follow 202203221620 The golden rule of programming and value simplicity and understanding over minimizing code.
-
Synergist leadership style
2021-07-24 09:54
Unlike the 202107240951 Visionary leadership style, 202107240952 Operator leadership style, and 202107240953 Processor leadership style whose patterns are based on their individual preferences and behavior, the synergist is primarily motivated and focused on what is best for the organization they are part of.1 They detach their personal desires and collect information from any source available to form high level direction for their team.
To manage a synergist, make sure that they aren't taking too much time to weigh up their sources. Push them to take action when necessary and contribute a personal judgment when integrating their final direction from their sources.
Natural synergists are rare, but people with the natural tendencies of the other styles can learn to be a synergist when necessary.
-
McKeown, L. (2017, June 27). What’s Your Leadership Style? The Do Book Company. https://medium.com/do-book-company/whats-your-leadership-style-fdc8bad45fe0 ↩
-
-
Make reversible decisions quickly
2023-12-09 15:03
Make reversible decisions quickly and irreversible decisions deliberately.
This saying has been popularized in the tech world (though I don't know the original source to attribute here, it's also mentioned in 202307241042 The Pragmatic Programmer1).
We tend to spend too much time in 202109090909 Decision paralysis when it's more often the case that either direction is fine and even if one is bad, we can reverse course. Because of this mis-attribution of weight on the importance of our decisions, we need a reminder like this one to push through that and take action.
Another interpretation of this is that 202312091509 There are no final architectures and 202312091511 There is no such thing as sacred code. Everything is subject to change and re-evaluation at any point in time. The only thing we should surely do is 202205031449 Optimize for change, which means making decisions with the knowledge that they'll be changed later.
-
Thomas, D., & Hunt, A. (2019). The pragmatic programmer, 20th anniversary edition: Journey to mastery (Second edition) (pp. 48). Addison-Wesley. ↩
-
-
Computer Science
2022-06-19 13:00
The nitty-gritty of computation and technology. Contrasted with 202109061338 Software Engineering which is more about the practice of writing software and careers or organizations in that field.
Curriculum
- 202208101944 Zero to engineer
- 202206282018 Curriculum design for software engineering
- Maybe start here?: MIT OpenCourseWare for Computer Science
- Maybe I should make this yet another structure note that lays out the whole process and what order and how things are connected? Probably just start doing that in this note and maybe split it out later.
Programming language design
- 202107272307 Data-first pipe design
- 202107272306 Data-last pipe design
- Go kind of sucks?
Asynchronous computing
- How does asynchronous stuff really work in JS? Promises, async/await, under the hood etc. #thread answer: JS spec requires implementations of JS to implement an event queue which JS processes fifo. Could be fun to implement a JavaScript runtime in Rust or something. (Might already exist from Mozilla, V8 is written in C++)
-
Circle of concern
2021-09-12 15:17
A metaphorical circle posited by Stephen Covey in his book 202106221713 Seven habits of highly effective people.[^covey2004]
This circle is a superset of our 202109121517 Circle of concern and 202109121516 Circle of influence. We should seek to minimize the things we allow into our circle of concern.
Anything that we're concerned about, but have no influence or control over, will cause stress and negative pressure on the things that you can influence or control. Identifying what you can and can't affect can drastically empower your actions and allow you to move from a state of 202109121550 Maturity of dependence to 202109121536 Maturity of independence and possibly into 202109121530 Maturity of interdependence.
On the other hand, this circle is something that highly effective people can think about and use to their advantage. For instance, we know that we can't control how cold the winter will be this year, but being interested in the weather patterns and using that concern as a source of information that informs our actions in some way that we can control — such as investing in natural gas that will be used to heat homes — could be beneficial. The goal is to know things in the circle of concern, but not allow them to affect us in negative ways.
-
Knowledge is constructed
2021-09-06 08:35
Constructivism and also Constructionism are theories of knowledge that requires there to be a learner for knowledge to exist. Until someone learns information, connects it to things they already know, and internalizes the information in a personal context, knowledge cannot exist.
Supporting arguments
- Having a text or reference at hand does nothing to increase knowledge, we have to create something, do the work, wrestle with the ideas, and engage effortfully to create our own knowledge.
- Research works better one thing at a time. Find a source, process it to completion, then use your newfound knowledge to find another source. If we don't, we run the risk of picking sources that are useless by the time we get around to reading them. Processing to completion includes writing about what you've read. This is where these notes come in. We take transient notes as we're reading and then write our thoughts here or in drafts of actual writing. (Iterative accumulative approach to writing #thread and writing is important #thread)
- Consider that data patterns and descriptions mean nothing on their own. For instance, strongly correlated but spurious patterns may be obviously meaningless.[^vigen2013] Instead, we require a pattern or description (what), an interpretation of that pattern (why), and — critically — to synthesize multiple interpretations, hypotheses, theories, or models into a bigger picture and create something useful or interesting (why why or higher level why). Patterns and interpretations are the main work of our knowledge management system here. Synthesis happens when we write about (or just read and string together all the knowledge we accumulate in the system).
-
Caution and perfectionism hurt progress
2024-08-06 01:33
Being overly cautious or too much of a perfectionist will undoubtedly limit progress and potentially even destroy the ultimate outcome of a project as a whole. Being overly cautious can manifest in different ways:
- Having meetings about meetings. This shows that there are issues with how the organization runs that need to be addressed pre- or post-hoc in order for something to actually get done.
- Meetings to discuss how we should do something in order to get consensus before getting things done. This shows that contributors do not have the authority, responsibility, or capability to do things individually and have to justify, wait, and ask others to do their job.
- A lack of desire from contributors to be associated with a particular project or task. This shows that risk and reward are not appropriately balanced in your organization. If people don't want to be a part of a risky project, then they know that they don't have the authority or latitude to address the project correctly or perhaps know that they won't be rewarded for working hard and taking a risk on something that could hurt them.
- Requiring large chains of approval and sign-off. If many people need to see something in order for it to be approved, then the contributors and the teams responsible for making something don't really have the authority or empowerment to do the job they were asked to do (202407081040 If you can't cancel the project you're not the product owner). If people who are not intricately involved in the project day-to-day get more say than as a potential source of feedback, they are in the way of that project's success and the team will revert to caution and perfectionism in order to avoid re-work and disapprovals.
-
Piping Code With GitLab CI
A Simple Way to Make Your Life Easier
2018-09-01 00:00
I finally got around to adding continuous integration pipelines to my personal projects.
What is Continuous Integration?
At its most basic, continuous integration (CI) is the practice of frequently merging developers' code changes into a mainline code repository. In recent years, the concept of continuous integration has taken on a life of its own and been expanded to include other aspects of development. For instance, almost anyone referring to continuous integration is under the assumption that the frequent merging will be automated. There have also been expansions of the idea such as continuous deployment (CD) where the code is not only automatically merged into mainline branches, but also built, tested, and deployed. By automating all of these simple repetitive tasks, developers can stop spending time on manual integrations and deployment processes and spend more time coding.
GitLab CI
For various reasons that are far outside the scope of this post, I host my personal code on an on-premises GitLab server. GitLab has hundreds of amazing features to take advantage and one of the nicest of them all is their CI/CD pipelines. GitLab has all of the automation and task running capabilities of other separate solutions built in.
-
The Art of using a Zettelkasten
2021-07-27 22:42
Using a Zettelkasten is more of an art than a science. It's a personal relationship with an extension of your knowledge. Above all, it's important to just consistently work and think in this system to get the most out of it.
Personal preferences
- 202109091129 Evergreen notes
- 202107272238 When to write a new Zettel
- 202107292312 Project structure notes should answer a question
- 202107292136 The context of a link should give you a reason to follow it
- 202109091133 Notes should associate organically
- 202109091131 Notes should surprise us
- Use a reference manager. The references in the manager should only be ones that have been read and processed, ready to be cited in Zettel as I write them as the last step to processing a source. Don't clutter the reference manager with things I would like to read some day.
- Use a plain text editor and files. This makes everything much more cross-compatible and future proof.
Workflow
There are categories of things that I do regularly, and my Zettelkasten has a specific single place in a broader workflow. It's important to understand how we think and how the processes we use to do that thinking and synthesizing affect your ultimate knowledge (202109080847 As We May Think).
-
My Brand New Blog
An Exercise in Futility?
2016-10-28 00:00
Maybe it's the infinite hubris of a millennial or maybe its just that I doubt anyone will actually read this, but I found a few reasons to convince myself to do it anyway.
I thought about that question a lot before building this. Most blogs are out of date, under-maintained, new year's resolution-esque things that wither and die after a few entries. Why create something that has a high likelihood of being abandoned? Beyond that, how could I possibly think that anything I have to say is worth writing about? Maybe it's the infinite hubris of a millennial or maybe its just that I doubt anyone will actually read this, but I found a few reasons to convince myself to do it anyway.
I'm Already Writing Anyway
I've been in the habit of keeping a journal for a long time. I keep it for a lot of reasons: it helps me think aloud, it helps me recap my days, weeks, months, years, it teaches me about myself, it gives me perspective on why things did or didn't break my way. However, a journal, at least how I write mine, doesn't work well for giving a single topic more attention. I still write about topics that interest me, but diving in and exploring those topics fully isn't something that fits in a medium whose primary purpose is to record and reflect. A blog, on the other hand, is the perfect medium to write in-depth on a single topic. A blog also gives me the flexibility to write about any topic that's currently interesting me.
-
First Reactions to React
A Review of Building My First React App
2018-06-01 00:00
We're moving our corporate site in house and I thought it would be the perfect time to try out a new javascript framework.
There are plenty of good javascript frameworks out there right now; among the most popular are Vue.js, Angular, and React. (Yes, I'm aware that React is a library not a framework, but for the sake of this article, I'm going to set that aside.) There's also a ton of posts and articles that can help you understand the differences between them if you're not familiar. Breaking down all the reasons we chose React over the other two would be a whole post in itself. Maybe I'll write something comparing the frameworks and our opinions on their features in the future. For now, it's enough to say that we took a hard look at all three of these and we felt that React was the best choice for our specific situation.
Diving In
We're using webpack for build tooling, a React front-end, and a C# .NET Core API backend. Getting started was the most challenging part of the whole process with the majority of the issues coming from the webpack configuration. I only ever used gulp before and we wanted to switch to webpack so that we could more easily bundle and ship specific components to third-party API consumers. I'm sure that someone more experienced with webpack could have gotten up and running in much less time than it took me, but it's always nice to have the opportunity to learn a new tool. Besides my personal inexperience, there were some versioning issues between the .NET world and the NPM world that we needed to resolve. We also added to our own headaches by using a slightly wonky legacy environment setup (that's hopefully going away shortly) and by having some external requirements from businesses we partner with. With all of the preliminaries out of the way, we could finally get coding.
-
Revamping My Blog
A New Coat of Paint
2020-06-01 00:00
You may have noticed that the blog got a new look and feel recently. The changes weren't purely cosmetic though. Let's take a look at how I migrated from a Bootstrap and PHP based blog to React, Next.js, and Styled Components.
Motivation
It's probably not a surprise to most people that I'd want to switch from a PHP based blog to something a little more modern, but honestly — and perhaps controversially — I think PHP is still an amazing solution for simple use cases like mine. No, the shininess of tech isn't a good enough reason on its own for me to rebuild the blog from the ground up. So what reasons were there for updating things and switching tech?
Criteria
- Ease of Maintenance — My blog was running like a dream for years on a crazy simple setup, so any solution that I went with was going to have to at least match it in terms of maintenance effort.
- Ease of Writing — There was quite a bit to be desired in the old setup. I was using a rich text editor that was hard to get well formed rich text data out of. It was also really difficult to use on mobile. Wanting to use a simpler format (like markdown files) and the ability to use a plain text editor was a big reason to make a switch.
- Performance — My old setup was slow for a host of reasons. I was running PHP and MySQL on the same old machine sitting underneath my printer. The thing was ancient when I acquired it longer ago than I care to admit. It would be nice if I could take advantage of something out there that did lightning fast static site edge cached delivery.
-
The Only Correct Way to Organize Code
A Joking Rant About Keeping Code Neat
2020-09-01 00:00
Why we need a system for code organization and what that system should look like.
Highway to the Danger Zone
Though the pattern is full and it will definitely get me in trouble, I'm going to metaphorically buzz the tower by putting some pretty strong opinions out there today about file naming and code organization. So buckle up Goose, and don't hit that eject button.
First off, file naming. The correct answer here is
kebab-aka-hyphen-case
which is all lowercase and hyphen delimited. No exceptions, and no, your community standards aren't a good enough reason to change this one as we'll see in a minute. Looking at youComponentName.jsx
👀 .Second, code organization. The only correct answer is
folder-by-feature
as opposed tofolder-by-random-devs-logic
orfolder-by-tech
. We'll take an organic trip through all three of these systems and see where we end up.Either of these alone is enough to spark a holy war among devs, but unlike tabs vs spaces, I think there's good enough objective reasons to pick one over the others. Let's take a look.
File Naming
I don't want to spend too much time on this topic because it's much less important to a team of developers than having a consistent system for creating, finding, and maintaining the actual functionality of your product through its source code. Still, you can see how it's in the same vein and deserves an honorable mention.
-
What React and Kubernetes Teach Us About Resilient Code
A Similarity Among Widely Different Tech
2019-11-15 00:00
A brief intro to control theory and declarative programming
This post was initially published as part of the Beam Engineering Blog here and cross posted here on my blog.
Two Concepts
Here at Beam, we're on a quest to make our technology work for everyone. As part of this quest and as a need stemming from our hyper-growth, my development team is shifting our focus away from feature development toward platform technology and developer experience.
On the infrastructure side, we've been working on a CLI tool for our devs that will let them easily manage infrastructure from the command line. They can spin up entire AWS environments and deploy code from multiple repositories with a single command — no more waiting on other developers for testing and staging environments to be free, and no more inconsistency between production and testing environments. The quest for consistency led us to containerization, and our quest for easy infrastructure management led us to infrastructure as code. Our containers and infrastructure then lead us to a need for better orchestration of those containers. We needed tools that would make the often complex task of deploying, integrating, scaling, and managing services simple and routine — enter Kubernetes.