In the month of feburary, I chose to act on whatever I said I will do: be more deliberate to read and spend some time introspecting on some topics on hiring.
In this article, I will be covering the few topics:
Figure out the next 5 steps, but execute one step at a time. You do not climb mountains in 1 step. You do it step by step. In this article, you can see which roles should be held by the founder while you hire in for the operational roles. You can find out what type of engineers you need for each stage of your startup. The personalities of your engineers will be an important criteria to consider.
While it test for logical understanding, it tests the candidates exposure of problems rather than the candidate’s ability to think of the right solution. While its not right, i guess big tech companies can only use exposure as a proxy for ability to cover wide range of technical problems.
Yes, you may not end up using the algorithm you are tested in your day to day tasks, but at least it tests the engineer’s ability to figure out the solution from his/hers wide exposure to technical issues
Consider your KPIs and OKRs. Do your daily meetings to find out their progress and pace.
Demonstrate impact through learning, experimentation and mentoring. With a good learning trajectory, you can typically expect good quality out of your engineers. You can then relate how performing well in the company + their current scope of work is linked to their own personal growth as well.
One of the points to note is how the little mundane tasks can be automated to help create more leverage for themselves. See how you can set up your engineers to consider boring work as an opportunity to find a new job, but rather an opportunity to find out how ops can be set in place to automate these tasks - boring but necessary tasks.
If they are teachable and demonstrate strong growth mindset, you can consider helping them to develop a curious outlook towards tech and biz processes.
Help your engineers develop work-life balance goals. You don’t just want to talk about it. Talk can be cheap. You want to get into a little details on how they can help support your company’s engineering demands outside of hours but also ensure it is within their comfortable level of work-life balance.
Knowing which page do people ask for help, can be a good indicator for you to put your tooltips and tutorials.
You want your app to feel like a home to them, being able to do simple customizations like adding emojis into the titles etc. Slack does it well.
You want your users to feel comfortable. Want them to use your application as if its their own little space. Emoji setup can be a simple way to allow users to feel this way.
- Understand what is the 1 + 1 = 3 design principle.
Designing with the white space insights.
What kind of manager do you want to be?
You want to be a coach. You delegate roles to different team players and you coach them to be better in the roles assigned. You don’t come in to micro-manage them.
As engineers, its easy to find out flaws in logic and especially so in pull requests. In code review, to be efficient, you have to be good at pointing out mistakes. But take a pause. Try to figure out how to point out mistakes that can help mentor/build the engineer’s skillset to improve. The delivery of mistake is just as important as spotting one.
The whole world is strongly opposing the deal from going through. It is interesting how much impact the world perceives of this deal.
The Man Putin Fears The Most
Random video that helps us to understand abit more on Russia’s most powerful man.
To keep the support that have gotten you the influence, keep the popularity with the people. Be with the people. Continue to lead the country the way people like.
If you want to move things you need influence. It is interesting how one keeps influence. Genuinely no comments on whatever choices that were made in the world but its a good reminder that while tech can advance things. Technology in itself is neutral. The intention of using the technical determines whether the technology is ‘good’ or ‘bad’
The first tweet by Jack Dorsey is sold for 2.9 mil.
Interesting idea if you can create a website that does only adds in JPEG and you sell it by the number of pixels. And you can accept only coins.
In blockchain, the group verifies the group’s every transaction.
NFT is able transacting on intangible items that have value because its unique.
In the concept of Software Development, you should find yourself splitting your time up between documentation, testing, discussion and coding. You have sufficient time to do all of these and sometimes productively with the right environment setup. Make sure you set up time for your deep-flow work (debugging a difficult code logic). Make sure you set up time for deep reading, exploring a new architecture. If you are in management position, you should definitely set up time for some mgmt training and self learning. You cannot consistently be stuck with operational stuff and lose out on developing yourself and thereupon your team for the next few quarters ahead.
Making components easier on the eyes is important to make a smoother UI component for your users. It has some psychological effect on the the users viewing the element
Giving customers a good experience
What is difference between code splitting and lazy loading?
Objective is the same: improve the speed of your application
Lazy loading: loading the resource only when needed to. You can consider that of lazy loading images.
There are a few types of implementation on Redis.
- Everyone gets all the messages on the subscribed channel.
- Pubsub works under the premise of ‘fire and forget’, means every published message will be delivered to as many subscribers as there are and then lost from the buffer.
- All the messages will be delivered to all subscribers.
- There is no ACK message to let publisher know that the message was received.
Use-case for pubsub
- Chat servers that allows you to create chat rooms by letting redis do the hard work of distributing messages among users. These chat rooms will not persist messages, but you could find a way around that by adding storage logic to your chat server.
- Notification service
- You can subscribe to a set of notifications you like to receive and then its a matter of publishers sending them to the right channels.
- You can consider this implementation when an admin creates a job, the job is published. Published jobs will create a pub to a notification service.
- Log centralization
Your own app is the publisher and difference services make sure they send the information to the right destination.
- Blocking lists
You have features such as LPush (push to the top of the list), RPush( push to the tail), LPop (Pop from top of the list), RPop(Pop from the tail)
You also have blocking commands such as BLPOP (blocking pop from the head), BRPOP (blocking pop from the tail)
When its blocking, used with an empty list, the connection from the client to Redis will be blocked until a new element is added.
When the list is blocked, a message is added to the list, the subscriber that has been waiting the longest will immediately pop the message off for itself.
- Messages are not distributed to all subscribes. Every message is only delivered to one subscriber with the feature that the first one to be notified, pops it out.
- The messages are stored in a list in redis, they are stored in redis until a subscriber is connected. If you configure redis to store data in the disk, you can get a reliable message queueing system.
Streams can handle more than just string elements. The internal strucuture of messages is a set of key-value pairs, so you messages can actually ahve complex structures directly in Redis (instead of stringified JSON objects)
Push data into stream: XADD
XADD yourstreamname *key1 value1 key2 value2
Read data from stream: XREAD
XREAD COUNT 2 STREAMS yourstreamname 0
XREAD BLOCK 0 STREAMS yourstreamname 0
Understanding dependency inversion is key. Understanding the different layers of your application is crucial on its separation of concern.
- IE is retired
You can find the news here.
Today, we are at the next stage of that journey: we are announcing that the future of Internet Explorer on Windows 10 is in Microsoft Edge. - Microsoft
Helps to address compatibility for older, legacy websites and applications.
In fact, Microsoft Edge is the only browser with built-in compatibility for legacy Internet Explorer-based websites and applications, including support for functionality like ActiveX controls.
The support for IE has subsequently dropped by Yahoo, Wordpress, Japan.
Typically IE has been used as the baseline for web development - aka that is the lowest level of browsers you should be adjusting your applications for. Now that IE is retired, there will be a new baseline.
3 browser engines to support:
- Chromium, the base for Chrome, Edge, Samsung INternet Browser. and Opera.
- Gecko, the base for Firefox.
- Webkit, the base for Safari.
Note that the rate of Safari users in Japan has been higher than global average. More than 66% of Japan internet users are iOS users.
If you have differences in OS, then you can expect the hardware to be different accordingly
All browsers in iOS are based on Webkit: There are Chrome and Firefox versions for iOS but those use the same engine as Safari in iOS. This is because of an Apple guideline which mentions that all iOS browsers must use Webkit.
Webkit under the hood have not implemented more than 3500 web platform tests
Graph derivative of “Mobile & Tablet iOS Version Market Share Worldwide” by Statcounter used under CC BY-SA 3.0. This graph is licensed under CC BY-SA 3.0 by Alan Dávalos.
In conclusion, we can safely assume that over 90% of the iOS market share will be constantly made up of major versions released in the past 2 years. In other words, we only need to support Safari versions released in the last 2 years.
Note that browser support has to also consider browser versions for a more complete implementation support.
So what is the new baseline?
- Safari is the baseline in terms of web standards: sites developed must work on safari versions at least 2 years old.
- Low-tier andriod devices is the baseline in terms of performance. Low-tier andriod devices have advanced little in the past few years so our websites must be super performant.
- 4G is the baselin in terms of network, mobile networks have been faster and more stabler across the world.
Some current standards across the world
- Size of median websites
Median website weighs 1,923 KB.
Source: “Page Weight” – Web Almanac 2021
The budget for a website to keep good performance is up to 100 KB of HTML and CSS, up to 350 KB of JS.
So typical websites now passed the standard for HTML and css, but has exceeded the quota for JS file sizes.
Median number of HTML elements: 31 - including, that means websites are displaying less content per page.
In the list of the most used HTML elements,is 1st place, is 3rd, and
is 7th. Moreover, the probability of a page having aelement is 98.9%; it’s definitely the most used element to display contents.
Note there are some elements with no special styles applied to it but has a semantic meaning. The usage of
Difference in flex and grid.
IE only supports an old specification of Grid (flex) so pages that want to support IE must take that face in account. CSS features cannot be polyfilled as easily as JS Features, thus not alot of people are using Grid. Now that the support for IE is over, grid can now become usable.
Source: “CSS” – Web Almanac 2021
The way to measure performance most commonly used is by measuring Core Web Vitals (CWV)
Given the more than average size of JS sizes coupled with mobile devices with lower CPU power, the performance of websites on mobile are slightly lower.
Since CWV is a ranking factor in Google search. Top 1000 sites based on views have good CWV scores.
Improving website performance is one of the ways we can directly increment revenue in our projects.
I thought this article has quite a meaningful summary to the web development scene in 2021
• If you can do something using CSS use CSS: There are many things that previously were only achievable using JS that can be done with only CSS nowadays. By doing that you can partly reduce your JS code.
- Evaluate your toolset: Many newer tools have better performance baselines compared to older ones, and not every project needs to be an SPA. Some of the non-framework-based SSGs like Hugo, Jekyll, or 11ty work great for those use cases.
- Build for modern browsers: Drop IE support and set your build target to ES 2017 or even 2018. Just doing that might get you bundle size improvements of up to 20%.
- Consider a11y from the beginning: Having a11y in mind from the planning and design stages is the ideal scenario. Starting by improving things such as contrast rates, font sizes, semantic HTML usage, and keyboard navigation can make a great difference.
Domain driven architecture is important to keep your code base centered around the business domains instead of the technical tools. Tools are just tools, you are putting tools together primarily so you can focus on solving biz domain problems; let your code base reflect this.
Engineers spend too much time figuring things out on their own before they get feedback. You should ideally get at least 1 round of feedback weekly or if not daily on your tasks. You want to quickly iterate and get feedback so you can deliver the best product as fast as possible.
If your application is sufficiently huge but not properly set up with separatable domains, microservice splits may not be an option available for you
always list out the painpoints you wish to solve with the switch to microservices. Move with a purpose. A strong one if possible. Listing out your pain points can help to reflect on the success of the shift to microservices. Are you now able to serve more concurrent users with the same specs of resources?
- nonblocking by default
- Better at handling error with the use of message queue
- With message broker instead of REST API, sevices receiving communication don’t need to know each other with better decoupling.
Factors of consideration
- Broker scale
- How many messages sent per second in the system
- Data Persistency
- The ability to recover messages
- Consumer capacity
- Is the broker capable of managing one to one or one to many consumers?
- around 50k messages per second based on config and resources
- persistent + transcient messages are supported
- delivers message via Advance Message Queuing Protocols AMQP designed to support complex routing logic.
- around 1mil messages per second
- Have persistency
- 1 to many only
- Can send up to 1mil messages per second
- its an in-memory datastore
- both 1 to 1 and 1 to many.
For short lived messages: Redis
If you do not need persistency, then consider redis. Fast service
For large amount of data: Kafka
Its ideal for 1 to many when persistency is required
Complex routing: RabbitMQ
Older and more mature technology