In this article I define a 1-5 rating scale for books in order to be consistent across my evaluations. Given that rating books is somewhat subjective, introducing some amount of standardization on how I rate them should help with managing my reading.
Format of presentation:
Score (from 1 to 5) Representative emoji
- Satisfaction
- Words expressing the level of satisfaction
- Strength of recommendation
1 đ¤Ž
- unsatisfactory
- very bad, horrible, boring, repetitive, disagreeable to read, waste of time, can't force myself to read
- strongly not recommended
2 âšī¸
- unsatisfactory
- bad
- not recommended
3 đ
- satisfactory
- neutral
- might want to read
4 âēī¸
- satisfactory
- good
- recommended
5 đ
- satisfactory
- very good, great, amazing, exciting, intriguing, fascinating, full of new knowledge, can't stop reading
- strongly recommended
Answering coding interview questions
History / Edit / PDF / EPUB / BIB / 1 min read (~123 words)- Read the problem statement
- Look at any provided unit tests
- Add any unit tests you think might be relevant and not currently covered
- Order the unit tests from easiest to hardest
- Ask questions to confirm your understanding of the problem and verify edge cases
- Think of a possible approach to solve the problem
- Share your approach with the interviewers and get their buy-in
- You may do this by writing pseudo-code as you are explaining your thought process
- Implement your solution
- If you encounter any difficulties, state them and explain what you are thinking
- Make use of preconditions/early exit if possible to handle empty cases
- Run your code frequently, even if it is not fully working
- Discuss any follow-up questions with the interviewers
The process described below attempts to optimize reading quality books and enjoying the reading experience. As such, it promotes book exploration (discovery of new books) and reading books which have a high rating according to your own taste. Books which receive lower ratings (compared to other books) are moved down the reading priority list and will not be read until books that have higher priority (i.e., rating) either are finished reading or their rating decreases such that other books are now high priority.
- Pick highly read books (use a site like goodreads to identify those books).
- When reading a book, record the page you start and stop reading on, the time you start and stop reading and emit a rating for what you've read.
- You can decide to optimize whether you want to optimize per page rating or per duration rating, that is, get the most value per page or by time spent reading.
- Add new books to your reading list regularly. Those books are considered as having the highest priority and are then added to the prioritized list of books according to its rating.
- When not reading a new book, read the books in order of priority and by interest at the time of reading.
- From time to time you may look at your list of prioritized books and decide whether the books with the lowest priority should ever be finished. In some cases it is reasonable to decide that certain books will never be read completely.
- As an alternative approach, one can use multi-armed bandits algorithms to decide which book to read next. Given that we can convert multi-armed bandits problem into the problem of selecting which book to read next given a sequence of readings and associated rating ("rewards"), the various algorithms (such as Epsilon-greedy or UCB1) will provide us with the next book we should read.
- Interestingly enough, an algorithm like UCB1 will promote reading books we've never read first over reading books we've already started reading.
- Read partially any book for which you haven't given any rating
- Rate what you have read on a 1 to 5 scale, 1 being very bad and 5 being very good (see book rating)
- Compute the weighted rating of the book (the sum of rating times # of page associated to the reading divided by the total # of pages read so far for the book)
- Sort books by weighted rating (descending), then average estimated amount of time left to complete (ascending)
- If you have books that you haven't read yet, go back to the first step. If not, then pick the book at the top of the list computed in the previous step, then continue from step 2
- It's better to read a good book than to finish a bad book
Planning large software projects
History / Edit / PDF / EPUB / BIB / 1 min read (~139 words)- List all the features you would like to develop
- Define an appetite for the task (day, week, month, quarter)
- Identify the features where the appetite differs between individuals and discuss them to reach consensus
- Define the roles necessary to complete the task
- Identify dependencies between features
- Categorize the dependencies
- Soft: somewhat depends on this other feature but isn't blocked by its absence from the codebase
- Hard: depends on this other feature and is blocked by its absence from the codebase
- Prioritize the features
- Use the RICE framework
- Priority can also be skipped if using ROI as prioritization metric
- Estimate the value of a features in dollars
- Calculate a ROI (return on investment) as the estimated value of the feature divided by the defined appetite
- Order tasks according to dependencies and ROI
Recognizing processes to follow
History / Edit / PDF / EPUB / BIB / 2 min read (~251 words)Given a library of processes, how can you determine which process you should be following?
Make a list of all the processes you have. Link to all the procedures to follow in each case. Some processes you will use so frequently that you will learn them.
Processes have starting points, that is, a trigger that initiates them. For example, if you have a process for code reviews, the starting point is the creation of a pull request by someone else. Another trigger might be the beginning of a new project. You should look for and recognize those triggers. If possible, when you document your processes, indicate what will trigger the instantiation of one of these projects.
Try to frequently look at the list of triggers and think about what you are working on or will be working on. This will allow you to catch processes that should have been started and followed, as well as let you prepare for processes that are about to start.
As you accumulate more and more processes, you will observe that there is a hierarchical organization to them. As one process starts, you can already prepare a list of processes you may have to follow soon.
You will also observe that the completion of a process often will lead to the start of another one. Once you've established enough chains (sequences of processes), it will be easier to identify and do the processes.