April 25, 2023 - Why Am I Starting This Blog?
Blog Creation
Today, I made the decision to launch this personal blog, inspired to embark on a journey of expressing professional ideas through writing. This motivation was sparked by a quote from Stephen King, which says, "I write to find out what I think." The notion of using writing as a means to structure thoughts and engage in deeper thinking during the writing process, as well as after ideas emerge, resonated with me profoundly.
This approach of "thinking by doing" mirrors my coding process and reminds me of a drawing class I once took. I was faced with the challenge of a blank page, unsure of where to begin. My instructor advised me to simply move my pen on the page, reassuring me that the ideas would follow. This wisdom proved invaluable in overcoming my tendency towards analysis paralysis, and I'm eager to apply these lessons to my writing journey here on this blog.
Civalgo Mobile app development
Today I dedicated most of my time to mobile app development, focusing on the creation of WatermelonDB schemas and models essential for storing daily logs within an offline database. Subsequently, I devised the necessary CRUD methods to modify these daily logs while incorporating hooks for seamless integration with React Native code. I saved the fetched daily log data in a Jotai store, which I then utilized to populate both the history page and the daily log modal.
Jotai Derived Atom Pattern
I have chosen Jotai as the global store for this project, and I must say, the developer experience of using this library has been exceptional. I've developed an efficient pattern to manage all the data transformations required within the application. Instead of handling data manipulation at the component level, I've employed the concept of derived atoms (also known as read-only atoms). For example, in the daily log store, I have a single writable atom that directly corresponds to fetching data from the WatermelonDB offline database, with all other atoms based on this primary atom.
This pattern appeals to me because it centralizes logic in one area, enabling easy reuse of the modified data. I appreciate the flexibility it offers, such as representing the same data in multiple data structures like arrays and key-value maps. This allows me to use the most suitable data structure on the front end, depending on which is ideal for a given situation.
Code example:
export const dailyLogsAtom = atom<DailyLog[]>([])
export const dailyLogInProgressDerivedAtom = atom((get) => {
const dailyLogs = get(dailyLogsAtom)
const dailyLogInProgress = dailyLogs.filter(
(dailyLog) => dailyLog.status === 'inProgress'
)
return dailyLogInProgress[0] || false
})
export const dailyLogsMapDerivedAtom = atom((get) => {
const dailyLogs = get(dailyLogsAtom)
return keyBy(dailyLogs, 'id')
})
export const organizedDailyLogsDerivedAtom = atom((get) => {
const dailyLogs = get(dailyLogsAtom)
const completedDailyLogs = dailyLogs.filter(
(dailyLog) =>
dailyLog.status === 'validated' || dailyLog.status === 'waitingReview'
)
const groupedDailyLogs = groupBy(completedDailyLogs, (log) => {
const date = dayjs(log.date)
const isCurrentYear = date.year() === dayjs().year()
const monthName = date.format('MMMM').toUpperCase()
const year = date.year()
return isCurrentYear ? monthName : `${monthName} ${year}`
})
return Object.entries(groupedDailyLogs).map(([key, value], index) => {
return {
id: index.toString(),
title: key,
data: value,
}
})
})
VS Code extension to generate Commit Message
Always eager to discover methods for enhancing efficiency and speed, I recently experimented with an extension called DIFFY, which generates commit messages using OpenAI ChatGPT based on code changes. Unfortunately, the commit messages it produced didn't quite meet my expectations. Nonetheless, I remain open to revisiting this concept in the future, hoping to find a solution that better integrates with my workflow.
Meeting with CRIM
This morning, I attended a meeting with CRIM to discuss potential AI collaborations for Civalgo. We considered shifting our focus towards developing a "Scheduling Assistant" rather than concentrating on machine learning for our data. I'm of the opinion that machine learning should be prioritized once we have a solution that doesn't necessitate large amounts of data for providing value to new clients, thereby addressing the typical "cold start" issue.
CRIM suggested creating an Expert System but expressed concerns about potential constraints on input. I proposed starting with input from professional construction estimators, trusting their expertise. Once the system can provide valuable advice and recommendations for clients' scheduling, we could be better positioned to offer guidance on task constraints. This would, in turn, enable estimators to make improved estimations based on the daily report data collected on our platform.
The shift in focus for our AI solution over the past year has resulted from a change in vision. Previously, the project lead was captivated by the potential of analyzing data from all clients collectively, aiming to identify patterns and establish standards for our client operations. However, implementing such standards negatively impacted the user experience, as clients appreciated the flexibility our product initially offered and were less interested in the patterns we might have eventually generated.
My current focus is on prioritizing client satisfaction, enhancing their experience, and delivering maximum value. I discussed this strategic pivot with teammates last year, and they agreed with the approach. Collaborating with CRIM is both an intriguing and exciting prospect, and I look forward to gaining insights and feedback from professionals in the field.
Retrospection
Today, our team conducted a retrospective session to discuss the highs, lows, and areas of potential improvement during the last iteration. We used a Miro board for this purpose, employing the "Rose, Bud, Thorn" template (https://miro.com/templates/rose-bud-thorn/) while collaborating via a video call. The session was truly engaging, and I'm thrilled to see our team embracing a learning mindset and a drive to continuously improve.
We agreed on action points for elements we appreciated and would like to replicate, as well as those requiring refinement and enhancement. With this forward-thinking attitude, I eagerly anticipate the progress we'll make and the heights we'll reach as a team.