What could be a better Christmas present than a completed app? Wouldn’t mind some socks tbh but this is what is on the list this year. I will be spending some time each day in the lead up to Christmas in the hope that I can miraculously complete this app project I’ve had in my head for about 6 months now.
day 0 — like uber, but for checklists
I have had a lot of ideas recently. A lot.
That sounds like a very positive problem to have, but unfortunately it is not quite that simple. The issue is, I have all these ideas, but I never seem to let go of them. They just hang around in my mind and pop up in random intervals almost daily. Most of these ideas probably aren’t very good but they take up space in mind nevertheless, and I’m beginning to forget the lyrics to Lose Yourself by Eminem which is far from ideal. The increase in quantity of ideas may be the result of trying to cut out almost all social media from my life and being alone with my thoughts for most of my time awake. I’m still trying to decide whether this has been a good or a bad thing. Regardless, I need to spend more time working on an idea, rather than coming up with more.
This is where the 25 days of app-mas comes in (I’m aware the title is pretty low tier but it’s the most wonderful time of the year so what are you gonna do). I had recently completed another project of mine and was trying to decide on what to work on next. While I was busy not looking at Instagram and pondering the emotional capacity of a bee, another thought entered my mind. It is almost the start of December, why not try to start and finish an entire app before Christmas? A perfect plan, what could possibly go wrong. December is a busy time for most people and I am included in that group. But that could also work to my advantage. 25 days not enough time to create an app? I’ll have to use my time very wisely. Too many events that go for far too long? I’ll have to be consistently putting time in every day and plan accordingly. The way I see it, there is no way I can fail, I either complete the app or I don’t. And if I don’t, I’ll come out with as many apps as I went in with, and will likely have learnt a whole lot. Win win.
Now I should probably talk about this industry-shaking revolutionary app I will be creating. So basically, it’s like Uber, but for checklists. Pretty self explanatory I would think. Obviously that is not the idea, my idea is much more boring. It’s just a checklist app, you know, the ones you’ve seen on basically every single YouTube and Udemy tutorial. Nothing groundbreaking but that is ok. I have very minimal experience creating a mobile app and I am using almost all new technology to me so can’t sign myself up for anything too wild. I do have some more interesting ideas to add on that have also likely been done before but if I don’t search for them on the App Store then they don’t exist to me. Ignorance is bliss until you release your app and find out someone has made the exact same one 5 years ago. Let’s hope that doesn’t happen.
I am planning to build this as a multi platform mobile app using Flutter as the frontend. I do have minimal experience with Flutter as I did attempt to build an app a couple of years ago. I have been a software developer for almost 2 years now so do have experience when it comes to building applications, my work is predominantly in building web apps. By the end of the 25 days I am aiming to have completed a working application that could be regarded as a minimum viable product. Something to get out into the world quickly that can be built on incrementally. I’m not exactly sure how well this will turn out, but I am willing to give it my best effort and see what happens.
My reasoning for starting this blog is to bring some accountability to this challenge. I am well aware that I will not likely receive many readers, but this is more of a personal exercise for me to be conscious of my progress while reflecting on each day of work. The time pressure as well as the journalling activities will aim to provide myself with some better insights into how I work and what works well for me. At the end of every day, I will write out a new entry for that day and reflect on how it went. What were some positives, did I get as much done as anticipated, how might I improve for the following day. I will also write down my focus for the next day and outline the milestones I am aiming to reach.
With all that being said, my focus for tomorrow is to write out the rough software architecture and design for the app and try to locate all the moving parts I will need to consider. Depending on time limitations, I will also attempt to get my development environment set up on my machine.
day 1 — that didn’t look too deep from over here
So turns out this may be more difficult than anticipated.
Management has made the precarious decision to integrate a cloud syncing feature into this multi dollar app start up. Unfortunately management was not liaising with the development team at the time of this decision, they had their heads in the same place they think the data will be going. Makes it even harder when management and the dev team all reside in the same head. Yesterday I was all bright ideas and even brighter outlooks on how the next 25 days would go. I did think that this would be a challenging project to take on in such a confined time frame. Maybe not quite to the extent that I fully realised today while trying to understand how to build a mobile app with cloud sync capabilities.
Obviously it was my own decision to have my app be synced across devices when you are logged in, but I thought that in this day and age, I really couldn’t afford not to offer that. So many apps offer cloud sync right from the initial install and to be somewhat competitive in an already saturated market, I had to match that, or at least try. This brought me to a path that was rife with anxiety and overwhelm. I felt way out of my depth, and I can’t swim. Nevertheless, I did some googling to try and understand the software architecture that mobile apps use to facilitate this syncing feature. What I found should have been my first thought. After I read that first medium article, I felt like it was so obvious. Local database on the client side app, syncing with a cloud database every so often.
After making this rediscovery, I felt much better. I was back down closer to earth, but my feet weren’t quite planted on the ground yet. I now had the difficult decision of what services to use for this functionality. After some more googling and YouTubing, I decided on a No SQL type database like Firebase or Mongo DB. I am leaning pretty heavily towards Mongo DB as I have a decent amount of experience working with that for my previous project. The decision to go with No SQL was made easy when I finally sketched out a bit of a software diagram and a use case for how someone would interact with the app. I will go into why this was the case tomorrow, but for now, just understand that the data that users would be entering will likely not have a rigid structure that traditional relational SQL databases thrive on.
I have come to the conclusion that although this project may have me a fair bit out of my depth, if I am to have the best chance at producing a complete app by the end of this, I will have to properly map out my development process. This means that tomorrow, my focus will be on getting down a solid requirements document and determining the scope of the app. I need to know exactly what I will need to develop. Once I have a broad overview of the components I will need, I can break them down further to more manageable tasks that I can work on one by one.
For example.
Main task: Ability for a user to create a list
Sub tasks:
- UI button to add a new list
- Create a new list object in the local database
- Navigate to the new list
This is a pretty rough example but you get the idea. Anyway it’s pretty late here and I’ve had a rough night arguing with referees at a futsal game so that’s all for today.
day 2 — target is in scope
And my mental feet are planted firmly on the metaphorical floor.
Today was positive. After the minor rollercoaster that was the first 2 days of this journey I feel like I am finally seeing the project through a realistic lens. I am no longer under the impression that I will be able to quickly and easily smash out an app because it’s “just like a web app”, nor am I discouraged to continue because I don’t believe I have the technical capabilities. I am confident in my abilities to learn technical skills efficiently, and use any resources available to achieve my goal. I just need to keep up some consistency.
My time today was spent writing out the requirements that need to be completed for my app to be considered complete, and setting up my development environment. Although I didn’t make enough time to allow myself a solid chunk of the day to work on these tasks, I still managed to get them done, mostly. The dev environment was fairly easy to setup but I wanted to do it today so that tomorrow when I go to actually start coding, I can jump straight in. As for the requirements and scope, I would say that I did about a 60% job. My time today was split up into 2x 30 minute blocks which made it difficult to fully encompass all the requirements of my requirements “document”.
After some thought, I came up with the following main tasks that need to be implemented into the app:
- User log in
- Create a list
- From template
- Custom list
- Insert / edit / delete entries in a list
- Delete a list
- Sync data across devices
- Share list with another user
- Allow other users to view / edit your list
After creating essentially the app scope, I expanded what I thought was the simplest task into sub tasks, so that I can begin working on it tomorrow.
Main Task: Create a list from a template
Sub Tasks:
- Initial UI and button functionality to begin create list process
- Create a local database to store list data
- Create template objects that can be copied to a user’s list
- UI to display created list
After writing these very brief tasks down, I felt like a weight had been lifted. I no longer had to create an app, I just had to complete these few fairly simple tasks. This feeling is not new to me as I often feel very overwhelmed when thinking about a new technical project. I get way too ahead of myself to begin with and think of all the great things it will be able to do, then I get closer to actually starting the project and I realise that it will be much more difficult than I initially expected when designing it in my head. The second part is usually me inflating the difficulty of the task, but the feeling is still valid. I am a person who requires big tasks to be broken down into the smallest possible sub tasks, so that I believe they are doable. The bizarre thing that I continue to realise while going through this process, is that I can recognise this is how my brain works, yet I still don’t have the foresight to anticipate it and do something about it before I start spiralling. Brains are wild.
When I finished setting up my dev environment, I decided to get the initial app started as well. I followed the Flutter docs and created the app, and then I watched a great video from one of my favourite programming related channels, Fireship.
https://www.youtube.com/watch?v=1xipg02Wu8s&t=603s
I would recommend anyone new to Flutter watch this video. It essentially goes through the very basics of starting a Flutter app and it does so at a pretty fast pace. It was a great piece of content to watch to gain a brief overview of the different widgets Flutter has available and how to use them. It also went through stateful vs stateless widgets and other useful Flutter related info.
My focus for tomorrow is to get a start on the list creation functionality. I will likely break down the sub tasks again to make them even more specific. I feel like if I get the local database configured correctly, the rest should be fairly straightforward. Should be.
day 3 — why can’t i learn this quicker
Underestimating time requirements seems to be the recurring theme.
I continue to find great difficulty in starting work on this project. I have ideas in my mind of how I will tackle the different tasks I planned to complete today, but still can’t seem to find the motivation to begin work until I have such minimal time available that I almost have no choice. The thing is, every time I do get started, I often find it even more difficult to stop.
When I did start to get into the development rhythm, I felt great. I was really enjoying using Flutter to build the UI and learning how to use all the different widgets in the material Dart package. I learnt how to manage state and navigation and did my best putting them all together to try and complete my goal for the day. Unfortunately I didn’t quite get it done, which is fine. I still underestimated the amount of time it would take for me to learn all the different concepts and how everything works together in Flutter. When I’m learning new technical skills, I severely discourage myself because I convince myself that I should be picking things up quicker. I should have the intelligence and ability to learn this almost immediately. That is never the case.
With that being said, I want to take a moment tonight, as I’m writing this, to emphasise the importance of self care. Specifically self care when learning new technical skills. Often times I will put a lot of pressure on myself to be able to pick things up quickly. During school this was something I was pretty good at and it allowed me to skip some of the hard work that is usually accompanied with learning certain things. As I have grown and found a career in a fairly technical field (software development), the skills I missed out on have come back to bite me. I am talking specifically about skills such as the ability to break things down and persist when concepts are difficult to understand. I’m not saying that I would have absolutely no trouble at all grasping new information and technical abilities if I had been able to build these skills in my younger years, I’m just highlighting some of the gaps I have found in myself which I believe wouldn’t have been as large if that was the case.
So what does this mean with regards to self care? The pressure I put on myself to be able to learn quickly is unhealthy. Which means I have to make sure I am not being too hard on myself when I inevitably find it more difficult than I anticipate to learn a new technical skill, such as mobile app development. Although I am a software developer and have experience building web apps, a mobile app is very different. I’m sure once I understand the principles of app development and specifically Flutter as a mobile app framework, I will find it much easier to build on my skills and more quickly implement features and functions, but I am not quite there yet. There will be times where I can’t understand why something isn’t working, and that is ok, because it’s part of the learning experience. When I encounter situations like these, my first thought is almost always that I mustn’t be intelligent enough to get this. These types of thoughts are both inaccurate and detrimental to any further progress. I need to be kind to myself. I need to allow myself to fail to understand the gaps in my knowledge. I need to take every obstacle and failure as a question I can only overcome once I find the answer. This is how I will learn and improve, not by discouraging myself and making it even harder.
I am trying to exercise these techniques in order to be able to learn in a healthier way and this project will continue to test me. I am looking at every day as a positive experience whereby I can learn something new. Regardless of how much time I spend or how many tasks I tick off, I will be learning something every day, and that is very valuable.
day 4 — unforeseen circumstances
I won’t lie, nothing really got done today.
I was geared up for a big day, so can’t complain too much. Long story short, I am getting a pergola installed at my house and that required me to dig up the existing garden bed. Today was digging day and my goodness it did not go well. Apart from the hours it took to actually to dig, there was a plethora of other problems that arose when we tried to transport the dirt. I won’t go into it too much but my grandfather’s ute almost needed a new clutch, and some new wheels. Luckily the only casualty was a bit bitumen that was the only thing stopping me from flying backwards off a hill. And that was the short version.
Anyway, the aforementioned situation was the sole reason that I didn’t have time to work on my app. There were no time management issues here today, it was all external. Finally someone to blame who isn’t me. man shakes fist at… dirt?. I did get about 45 minutes of work in where I spent the time learning about the provider package for state management. I am very happy I managed to make some progress, however little it was. Honestly I’m just surprised that I could sit in my chair for more than 10 minutes before my spinal column disintegrated. This sedentary fella wasn’t built for hard labour.
So that is it, had a bit of a wild day, learnt a bit about state management, and now I am going to sit on the couch and relax because today, I really feel like I’ve earned it.
day 5 — making progress
Only took 5 days to be able to create a list.
Compared to yesterday, today was a fantastic day of app development. I ended the day with about 4-5 hours of solid work under my belt, more than I had spent in the 4 days prior put together. And that also includes about 45 minutes of trying to get my Git repository configured (turns out I kept creating a new repository within the file structure of my app without realising. I aM soFtWarE deVloPeR). Apart from that minor hiccup in the morning, the rest of my day went very well. I managed to not only complete the create list functionality, but I learnt a great deal about Flutter app structure, Hive data persistence, and Flutter UI building. I feel very accomplished as I’m writing this, what a time to be alive.
The actual tasks I managed to complete were as follows:
- Made the UI look like a half decent app
- Initialised the Hive package as my local database
- Added ability to create a new list with a specified title
- Added ability to delete a specific list
- Learnt more about Flutter file structure
Now that I’m looking at my achievements for the day in a 5 item long list, it seems much less impressive. But reflecting on how the day actually went, a lot of the time was actually spent learning about how state and Hive works together to allow for persistent data that updates the UI immediately. I also spent a fair chunk of time learning about the provider package for state management. In the Fireship video I linked to earlier, it was mentioned that provider was a recommended package to use for state management, instead of using stateful widgets. I took that as gospel and decided to run with that. I found issues when I was learning how to implement Hive. All of the tutorials I came across were using Hive with the standard stateful and stateless widgets that Flutter provides out of the box. So I scrapped all my provider work and continued on.
Another thought I had during the later part of the day, after I had finished development work, was the idea that I should have just used Firebase from the start. There may be some benefit in using Firebase because of the ease of cloud syncing capabilities. My only reservation was that when I was comparing Firebase to other solutions, it was touted as an “online first” technology. I was reluctant to then proceed with it because I wanted to make sure that my users would be able to access their lists at any time, even when they are offline. I now realise that may be a very small percentage of the user base as so many devices are always connected. Regardless of my decision, I will progress with the intention of using Hive and MongoDB and if I have to change, it just means I’ll learn even more things.
One of the biggest achievements today that was not directly from development work was my time management skills. I had the opportunity today to spend a few hours working on my app, but also had other tasks I needed to complete. I’m proud of myself for being able to start working and to continue for an hour at a time at the very least. I was somewhat disrupted by other tasks but that did not stop me from getting right back into VS Code to continue where I left off any chance I had. The only issue I ran into was when I completed the initial task I set out to complete. After I had added the ability to create and delete a list, I felt a bit lost. I knew what main tasks I had to complete, but felt very reluctant to begin work on any of them. I believe this was because I had yet to break down any of those main tasks into sub tasks. This meant that every task I looked at was too big to handle and I didn’t even entertain the possibility of starting any of them. To rectify this going forward, I will spend some time tomorrow breaking down each of the main tasks into sub tasks (I was supposed to do this a couple days ago but only completed it for the very first task). This will allow me to feel more comfortable moving straight to the next task because it won’t read “Add ability to log in”, it’ll be “Create login UI widget”. Much more manageable.
As for my focus for tomorrow, as well as writing out all the sub tasks, I want to be able to add items to each list. Now that I have the base knowledge of how to create classes and persistent data, I feel much more confident in my ability to complete this tomorrow, even with much more limited time.
day 6 — we are experiencing technical difficulties
Let’s talk about engineering solutions.
First things first, productivity for today was at a high level and I technically achieved my goal. I can now add items to a list, although it is just a hard coded string that auto adds at the press of a button. There would’ve been more progress, however I ran into a technical issue. While trying to add and save items to each of the lists I create within the app, I noticed that only the first list was having items saved in it, and the other lists just had copies of the first list’s items. This occurred during the later stages of my development timeline for the day and at that point I was ready to have a break and come back to it the next day. Even if I had stayed to continue working, I don’t often find success in persistently trying to solve a problem after I’ve worked on and thought about it for more than about 30 minutes. So the decision was made to leave it.
I had spent a bit of time away from the problem and was beginning to feel ready to jump back in. I felt close to a solution and had some ideas of how to reach it. While walking to my car to get home from work, I began to flesh out my ideas and really formulate solutions. We are talking one hundred per cent Zach Galifianakis vibes. Numbers and letters floating around in my head while I’m talking to myself waiting to cross the road at a busy intersection. I knew that the problem stemmed from the fact that the list I was passing in to the list items screen was always the same one because I had hard coded in the database ID. I had to find a way to look up the list in the database using some unique identifier. So the two possible solutions I came up with while channeling my inner Zach were:
- Use the inbuilt Hive index
- Give each a list a unique key.
I knew the first option was likely a no go due to the fact that I didn’t believe Hive kept constant database indexes when a list was deleted. It still could’ve been the solution, just needed some further testing. The second option was more likely to solve the issue. If I could find a way to give each list a unique key, then I could look up a specific list by its key. I found the UniqueKey built in class in Flutter and thought that was a decent way to do it. I had to test if I would be able to save the UniqueKey object as a field in my UserList class, or if I had to convert it to a string. Either way it was still the best option I had. Then I found some holes. What if the user migrated their data to a new device? Would the unique keys transfer over or would there be the possibility of duplicate keys? To solve this next possible issue, I decided that it would likely be best to give the UserList a UniqueKey when I first save it to the database, instead of automatically creating it when I create the object. That way I could check the rest of the database to ensure the key I was about to assign wasn’t already in use. A bit of a rough solution but it was the best one I had at that moment.
No more work was completed on the app after I got home. I had a fair few other house things to do and didn’t even look at the code until later in the evening. Turns out that may have been the best outcome for the night. While I was reflecting on my 6th day of app-mas, I realised something I completely missed when debugging earlier in the day. When the list items screen was being created, I was passing in the UserList object which contained the list items. But when I was displaying the list items, I was retrieving the data again from the database, using my hard coded value. So I had the correct list when I opened the page, but was then immediately replacing it with a different one from the database. Removing one line of code caused the add item feature to work perfectly. What a result.
I feel like this highlights the importance of taking a step back when working for multiple hours. You can so easily get stuck and boxed in to one solution or one way of thinking about a particular problem. Sometimes you need to stop, relax, maybe go for a walk, and then come back to it. I’m sure there is research to support this claim but I am too lazy to find it at the moment so have a look for yourself if you feel up to it. I know that in my experience, this is often the path I take to solve technical difficulties. I just need to learn to identify when I am in that mental box sooner.
After a successful day 6, I am ready to start making solid progress on my app. I feel like I have an even better understanding of CRUD operations when interacting with the Hive database and believe that is the foundation with which to build the rest of my app on. Tomorrow I will focus on completing the list item features and by the end of the day, I will be able to add, edit, and delete a list item.
day 7 — re-thinking and re-engineering
Full steam ahead until I can’t put down track fast enough.
Today I ran into what was probably the roadblock so far. I came to the realisation that my app had no direction. Let me explain. So far I had been doing very little in the field of actual planning (I’m not going to count the initial scope and requirements I documented at the beginning as this is not quite the same thing). Once I had in my head the rough steps I had to take to start working on the app, I went for it. I knew I had to be able to create a list, and then create items attached to that list. I had the other bigger ideas in my head like user authentication and sharing a list, but these were so far off to me they weren’t even being considered while programming. This was my mistake. I had in mind the rough tasks I had to complete to build app functionality, but I didn’t once go into the proper details of how I was going to design and build these tasks.
I’m not sure I’m explaining myself very well so let me illustrate with an example:
While I was implementing the feature to be able to edit a list item and change its description, priority etc, I was unsure where I should house the edit functionality. Should I keep it the same as the home page and have it behind a slidable widget that reveals both edit and delete? Should I open up the edit window on a tap of the item? What option was the best to keep a consistent UI design within my app? This was my predicament.
Hopefully that clears it up a bit. Not only was I stuck on how to create consistent UI design, I wasn’t certain on how my data would look. I knew that there would be a top level list, then under that, many list items. Apart from that, I didn’t have anything else to go on. I needed to flesh out my data to build a solid foundation, then ensure I was creating design elements that were intuitive to use across all screens of the app. This required some proper thinking.
Tonight I managed to write out the beginnings of a database relationship diagram and also some screen mockups. It was a good start but I needed to work fast and effectively if I wanted to jump back into actually coding the app. So my focus for tomorrow is to establish a consistent UI design framework for how elements will be interacted with. I will need to do some googling as to what the best way to go about this is, and I will need to do some of my own testing of current list style apps to see how they work. Getting more of an idea of the possibilities will help me understand what I think is good, functional design, and what needs improving. Although this has been a sizeable roadblock, I am in a positive mindset and am currently re evaluating my choices to clear it as soon as possible.
day 8 — back to basics
Today was a necessary exercise in app design.
I did not even open my code editor today. Well, that’s only mostly true. I really don’t like closing programs that I may be using in the next day or year. What I mean is that I didn’t do any programming. Today was a day of app design and planning. Yesterday I realised that I had almost no clear path to my goal apart from the shining beacon of light obscured by sand picked up by the wind. I needed some checkpoints along the way to make sure I was heading towards that beacon that is the completion of my app. So I decided that I would stop everything and start properly planning my journey. My aim for today was to solidify my data design and the relationship between the different objects used in my app, and to sketch out the UI and how the user would interact with each element of it. I was really starting from scratch.
I have only got so far as the functionality, class structure, and UI design of the initial list creation part of the app. But I really did meticulously plan out exactly how each UI element would look and react to input given by the user. I drew every step of the list creation process. From the first button press to the confirmation of list creation. Every dialog that would pop up, every field to be filled in. I was not taking any chances this time. I’m already 8 days in and I can’t afford to start again if I’m to reach my goal by day 25.
Planning everything out did make me feel much better about my prospects. Before I was sailing rudderless through the mildly treacherous waters of software development, I am now able to see the path ahead and direct my focus towards my goal, not just to making it out in one piece. While coding I was having to make design decisions, as well as functionality decisions every step of the way which became tedious and exhausting. Although my app was still a minnow, it was difficult to keep afloat above all the code duplication and sporadic CRUD operations. Now I have the experience to know that any changes made to an object of a class, should be defined as methods within that class. I’m eager to get back into programming tomorrow because I know exactly what to do. I know exactly how the UI should look. And even though it may not be what the final design may be, at least I have something to replicate and test for myself. If it ends up not being what goes into the final app, at least I will be able to create it quickly and not spend hours pondering what I should include in each widget.
My focus for tomorrow is to get back to the beginning and once again, be able to create a list. But this time, I will do it properly. I have the class attributes it needs to have, as well as the methods. I know what the UI should look like and how it should flow from step to step. I am very optimistic about the outcome of my day tomorrow and really believe that I can start again with a much stronger foundation.
day 9 — creating a list. again
Today I created a list, it was a good day.
I don’t have a whole lot of commentary to provide on my day today other than my goodness am I glad that I planned out my app. It was so easy to basically just write out the code I had pre thought of. I didn’t have to spend time thinking about what I wanted to do, I just had to decide how I wanted to do it. My app can once again create a list object and save it to the database, but now with a whole lot more fields that are actually relevant to the future features of the app. There is a much clearer plan in place and even though I am functionally back at square one, I know that it will take much less effort to get back to where I was before. Which admittedly wasn’t really that far anyway.
I’m gonna leave it there for tonight because I wanna read a comic.
Tomorrow I will focus on getting my custom fields to attach to the UserList object. I already have a rough idea how to do it, but I am definitely going to make sure I plan it out before I start coding.
day 10 — finding my passion
The fire has been lit.
Something I have only recently discovered about myself is that I am truly passionate about software development. This isn’t the result of me building this app, but it has only come to my attention within the past few months. I really do love creating software, and building this app has just reaffirmed my belief. For most of my adult life, I was perpetually worried that I was not passionate about anything, at least nothing that could provide me with a degree of financial security in my career. I had spent majority of my 1 and a quarter university degrees not knowing what I actually wanted to do with my life. Even while studying computer science, I never found that spark that I was so desperately looking for. I knew that I needed to love my work to want to continue doing it because I find it very difficult to motivate myself, even when its for things I enjoy. So when I did initially catch glimpses of this passion, I was eager to keep pushing to ensure it wasn’t just a fleeting moment of enthusiasm I would soon look back on as a lost possibility.
One of the biggest factors that solidified my belief that creating software really is my passion, was my day of app development today. It was not a particularly great day by software development standards. I didn’t actually make that much progress, and I still feel like I’m in roughly the same position I was yesterday having spent about 3 hours working today. But none of this mattered to me. The thing that mattered most was that I loved every minute I spent working on my app today. I encountered error after error, just trying to work out why my listview wouldn’t scroll. I spent at least an hour trying to solve a trivial problem involving how I would re render certain widgets on the screen. But during all this, I was just happy to be where I was. Sitting at my computer, designing an app, writing code. Nothing else around me mattered, I was in my own world surrounded by classes and strings and widgets and the following assertion was thrown building AddCustomFieldWidget(dirty, state: _AddCustomFieldState#cc79f). I truly did enjoy every part of the process, and I didn’t even fix all the errors. And by the end of the day, still not being able to create a list, I was happy with how I spent my time, and I’ll likely do it all again tomorrow.
day 11 — weekends are for work?
Incorrect, Christmas weekends are for everything but.
I really was kidding myself into believing that the weekends will be available to do the bulk of my app development work. I honestly thought that every weekend I would have 4+ hours of uninterrupted work. What a young, naive fool I was thinking that. The Christmas period is not a time for relaxation, at least not in my life. I can’t complain too much as I’m not actually that busy, there just tends to be a lot of things that come up during this time. Having now seen 2 consecutive weekends where I have had very little actual time to do any programming, I am now slightly more skeptical of how complete this app will be come day 25. In saying all this, it’s only Saturday and tomorrow really is looking like more of a chilled out day. We shall see.
In terms of progress today, I am actually really proud of what I’ve accomplished. I did end up spending a couple hours working on passing data back and forth between widgets and I think I’ve got the hang of it. It has been a slight learning curve but just as I was about to start winding down for the night, I got it. I am not able to open a dialog, pick a colour, then have that colour change on the previous screen. Doesn’t really sound like a big achievement but I am mostly proud of myself solely for the fact that I had the motivation to do this on a Saturday night. I even started playing a new video game but came straight back to work after about half an hour. Unheard of.
My focus for tomorrow will still be on creating the initial list (although technically that is complete). I feel pretty confident in saying that I will have all the field selection functionality done tomorrow. It is about 70% done and with my newfound knowledge, I think I know how I will get that final 30% out.
day 12 — roadblock
This may take a bit of elbow grease.
After a great day yesterday and a productive morning today, I felt on track to smash some app development goals, mainly being able to finally create my ideal list object. This turned to be far from the outcome of today. It all started well, I re styled my list field widgets and they were all working correctly to change and add options, but the issue came when I tried to delete a list field. From the very beginning I noticed some strange behaviour. I implemented the delete feature and essentially just did a list remove operation where the id matched. But when the widget was deleted, it looked like it was always deleting the last element, no matter which widget I specified to delete. After some code changes and a lot of print statements, I found the actual issue. The deleted widget was always the correct one, the problem was that the text field, housing the list field name, was not being attached to the correct widget. When a widget and its corresponding list field object was removed from the list, the text field stayed at the same index as before. So even when I deleted the 2nd widget out of 3, the 1st and 2nd text fields would remain and the 3rd would be deleted. But the 2nd text field would attach itself to the 3rd object. Very confusing, even if you did follow along with what I just said. The rest of my Sunday was not so enjoyable because of this.
When things like this happen, mainly technical issues I can’t solve within an hour or so, I get in my own head and start feeling quite upset. I question my intelligence, my ability to understand and comprehend technical knowledge, and today I felt like I wasn’t someone who could actually make an app. All things that are far from the truth. I am capable of creating an app, I just need to be allow myself some time away from the project to come back with a fresh pair of eyes. I did spend a couple hours away from my computer, just doing house work things. Coming back after that was still not a fruitful endeavour. I was still unable to solve the problem and began getting more and more frustrated with myself. I needed to take a day.
I decided that I wouldn’t spend any more time working on the app today. It was likely only going to bring me more frustration and discouragement, 2 things I did not need. It was a shame that it happened so early on in the day, because it was in the back of my mind while I was trying my best to have a lazy Sunday. When things like this happen, I usually look to be keeping myself busy with something unrelated. Unfortunately there were no such events to partake in, and the housework was now done for the day. I tried to relax by watching a movie, and that did take me out of it for its duration, but as soon as those end credits rolled and I saw my reflection in the darkness that was my iPad screen, it was back to feeling pretty rubbish. I didn’t want to spend the rest of the day watching movies and tv shows, so I didn’t. I can’t really tell you what I did for the rest of the day, but I cleaned my car and went for a walk with my partner which was quite nice, and I probably should’ve done that earlier.
Nevertheless, tomorrow is a new day and a new opportunity to solve this issue and hopefully gain a better understanding of the Flutter framework. That will be my sole focus for tomorrow, with the exception that if I can’t find a solution before 12pm, I will move on and find something else to occupy my time. Maybe I’ll begin on the user list item screen.
day 13 — a minor diversion
How can I spend a whole day on a problem, then fix it the next day in 10 minutes?
Yes, I did find the problem that was causing me so much frustration and discouragement yesterday. I was correct in my assumption that it was something to do with the key of each widget. All I ended up doing was turning my list field object into a ValueKey. How simple was that. It did take a bit of reading and stack overflowing to reach that conclusion, but I am both relieved and annoyed that was what it was. I’m glad that the problem turned out to be a very simple fix and didn’t require me to rebuild entire portions of the app, but I’m also annoyed that I was hung up on it for over an hour yesterday and then ruminated over it for the remainder of my Sunday. Oh well, such is programming.
Even after a very successful morning, the rest of the day was not as productive. For a reason unknown to me I felt very lethargic and really didn’t feel like doing much of anything. I was finding it very difficult to gain focus, and then losing it quickly. I don’t think it’s due to overworking myself, because I feel like I haven’t even done enough to be remotely near that point. I did have about an hour in the afternoon where I was motivated enough to think about how a user would add a new list item, but that’s it.
After another interesting day, I feel positive about tomorrow. I fixed the issue that was weighing on my mind so heavily and am onto building the next big part of my app. I have also only just realised that I am over halfway into my 25 days of app-mas. That came up real fast. Feeling slightly less positive now.
My focus for tomorrow is to design the user list item screen and the screen or dialog that will allow a user to add a new item to their list. I have a decent idea in my head but now know from experience, I have to properly flesh out the design and get it out onto paper before I begin to touch my keyboard.
day 14 — leaps and bounds
Kind of but also not quite Superman level leaps and bounds.
I had a good day today. It seemed that things were really going my way. I didn’t start any of my work until pretty late into the time I had available, but when I started, oh boy did I start. The first half an hour or so was spent working on the data design and UI design of the list items. I wasn’t exactly sure how I wanted the user data to look but ended up settling on a map of strings and maps of strings and values. Very confusing but essentially the data looks like below:
UserListItem:
'id': 'some gibberish',
'name': 'this is a list item',
'properties': {
'colour': {
'type': 'option select',
'value': 'red'
},
'brand': {
'type': 'text',
'value': 'pelikan'
},
'inked': {
'type': 'checkbox',
'value': 'true'
},
}
There will likely be some changes in the future with naming but this is the general idea and I’m pretty happy with it at the moment.
After I finished my rough design, I started coding up the dialog that will open when a user wants to add a new list item. This was a bit of a challenge but I got there in the end. The main struggle was getting the data fields to match up with the UI fields, most notably for the drop down menus. I was stuck on it for about half an hour but after doing a bit of reading (unrelated to the project), I came back and wrote down how I needed each of the different components to map to the data. I didn’t even finish doing that properly and I had a realisation of what I needed to do. Another example of me really needing to write things down and get them out of my head to work them out.
But I didn’t stop there. Because I was on a bit of a roll, I decided to try and get the actual adding of a list item done, which I did. I was able to enter in the different fields and display them as text once I saved the list. They are currently not styled and I’m not 100% on how I’m going to display them, but at least the data is there, I just need to work with it. What progress. I had a feeling that I wouldn’t have the most productive of days, but was I glad to be so wrong.
My focus for tomorrow is to design how the list items will be displayed, and then get to programming. Maybe a tall order, but after the results of today I am feeling up to it. Essentially once I get this done, I will just need to code in all the editing function (hopefully not too difficult), and then that is it for the base features of the app. Really exciting. And here I was feeling so discouraged just 2 days ago because of a minor bug, what a rookie.
day 15 — designing success
Slight decision hinderances.
Today’s progress went well up until the point where I was unsure which path to take the design of the list items. I had already sketched the rough concept of what I thought I wanted the list items to look like. Unfortunately I had missed a fair few significant factors. I had a look at some of the other list and to-do apps out there and found some of the missing pieces. A checkbox for ‘is completed’ is pretty much mandatory but given the goal of this app is to be as customisable as possible, I will leave it as a default option that is removable. The next thing I realised is that a date and/or time will be something people would want to have as a field, completely missed those 2. Also priority should be restricted to only 1 instance as that dictates the colour of the card, something that would conflict if there were multiple. Now that I’m thinking about priority, I realise that some people will not want to have priority attached to every list item so need to make that option. See what actually getting thoughts out of your head does, forces you to rethink the same ideas and find additional thoughts that branch off those. This must be like those binary trees they were banging on about at Uni. Should’ve paid more attention during that lecture.
So I decided to make a decision. I had that many different possibilities for how the list item will look on the screen, I just had to go with one. I decided on the what was probably the simplest, but also the most easily enhanceable option. I can always add things later, but I need to get it to a state where it can be used and tested to find what’s missing. I would much rather under build and enhance, than over build and cut back. Really don’t want to have to remove things I spent a decent chunk of time on if I can avoid it. There are still some very minor decisions I will have to make tomorrow, but at least the major ones are done and dusted.
That’s really all I have to say at the moment, just needed to flesh out some ideas a bit more to get my head around what I actually want, and what would actually be useful for the user. My focus for tomorrow will be to build the list item UI as I’ve now designed it. Even though it may not be the final design, I can always add on to it later.
day 16 — the little things
Why do I spend so much time focusing on the little things?
At least an hour of my day today was spent trying to get the list item card to look perfect. I was constantly changing the amount of padding, how things were aligned, changing icons. Why did I do these things. There is a time and a place for attention to detail but right now is not that time. I should be focusing on the actual functionality of the app, not if everything is aligned 100% correctly. I know that I won’t be releasing this as it looks right now, it is the most standard looking app and that is not what I’m about. I will most definitely be overhauling the whole look and feel of the app, once the base functionality has been completed. But the base functionality has to be completed for me to get to that, and I won’t complete the base functionality if I keep trying to make everything look perfect.
Ok rant over. In all seriousness, I know I can get carried away on the most minor of details. This isn’t always a bad thing, especially when I’m at the tail end of a project and getting ready to complete it. But for now it’s frustrating because I know that today has been a prime example of time poorly spent. I need to keep focused on the things that matter, I need to make sure I am continuing to write out all the tasks and sub tasks I need to be completing next. Likely one of the reasons that today didn’t go very well, was because there wasn’t really a plan. I knew I had to focus on getting the list item card UI looking decent enough to be presentable in a version one app, but that was it, and that didn’t take me very long to complete. Direction is the key. No point setting out to sail without a plan. Even if that plan is to have no plan, it’s still a plan in my books.
My focus for tomorrow is to be able to delete and edit a user list and a user list item. Tonight I will write down the individual tasks I need to complete tomorrow and possibly start working on them. Or I might just eat an ice cream and watch Seinfeld. Leaning toward the latter.
day 17 — two steps forward, half a step back
Just a minor setback.
I’m writing this day 17 post the day after because I was out last night and really couldn’t be bothered doing anything but going to bed as soon as I got home.
Yesterday went really well up until a point. That point was when I realised I had to seriously consider how to edit a user list object. My issue was that I was passing the existing user list into my edit screen (the same one that is used to create a new list) I was saving all the changes before I actually wanted to save the changes. All the editing functionality had to be reconsidered and I didn’t feel like I wanted to do that yesterday. Unfortunately today is hot as hell and I will probably feel less like doing it. Nevertheless I will soldier on and give it a crack and see what happens.
The rest of my progress was positive, I can now easily delete a list and list item, and everything saves correctly to the local database. I’m now closing in on completing the bulk of the functional capabilities of the app that are required to release as a beta version 1. That isn’t quite what I was aiming for at the beginning of this project, but I definitely under estimated the ease of development and how quickly I would pick up the Flutter framework. Not uncommon for me. I’m still feeling really happy with what I’ve done and how the final week will turn out. One week is not a lot of time, especially because we are in the thick of the Christmas season now. But I still feel that I will be able to get most of the local functionality done and dusted. I realise that user log in and authentication will not be completed due to the fact that I will have to implement a lot more than just log in. I’ll have to spin up the database, create an API that can communicate with it, and everything else I can’t think of right now. A lot of work.
For now my focus is on finishing all the local features of the app. These include:
- Creating, updating, and deleting a user list and list items
- Displaying list items in an intuitive way (possibly multiple different views)
- Filtering and sorting list items
- Creating a list from a template
Most of this is at least partially complete, so I’m confident in saying that the rest will be done by day 25.
My focus for tomorrow (today) is to get user list editing working completely. I know I can do it, I just need to put my thinking hat on and write down words until I come up with a solution. I’ve had more difficult problems before, I will get past this one.
day 18 — almost nothing
Snuck in some work right at the last minute.
Sitting here reflecting on the day, I am very surprised I actually got any work done. Today was one of those days where I didn’t feel like doing anything that would strain my brain. I felt like sitting on the couch and watching YouTube all day. Unfortunately, due to this challenge slash project I have committed to, the feeling was always in the back of mind that I would be failing if I didn’t do something. So what did I do? Well, instead of sitting down and doing a little bit of work to get it over and done with, I decided that the logical solution was to pretend like I had a whole bunch of other tasks that had to be done and convince myself that I was too busy today, but I would work twice as hard tomorrow.
A couple issues with that logic.
- Although I did technically have things to do, they didn’t have to be done today, and they were not big enough to take up the entirety of the day
- I knew that “working twice as hard tomorrow” would never be a good option
To elaborate on point 2, the reason I know that this is a terrible option is because tomorrow would come, and then I would be stressed out about doing twice the work because I was supposed to half of it the day before. This thinking may work for others but it sure as hell does not work for me. It just makes me feel bad and I do not need that.
So knowing both of these things before starting my day, you would think I would be well informed to make the correct decision. That would be an incorrect assumption. I proceeded to complete a whole bunch of house work and other tasks I had on my list for the weekend and week ahead, and when I wasn’t doing that, I was watching YouTube. Perfect. It’s like I am setting myself up for disappointment.
Luckily the day did not continue with the same trajectory as the first 3 quarters had set out for it. For some reason, unknown to me, I began doing some work just before dinner. Not a great time to start, but at least I did start. I even surprised myself. I had not expected any productive app development outcomes, but there I was, sitting at my computer, working. The work didn’t stop when I ate dinner, I even went back and continued work for about another 2 hours, more surprises. I didn’t quite achieve what I had hoped and I still can’t properly edit a list, but I am getting closer and more pieces are moving in the right direction. At least now they are on the same table as the puzzle.
My focus for tomorrow is once again, to be able to edit a user list. I have the solution, it just isn’t solving the problem in the way I was hoping (ie it was not solving the problem). I am confident I can make some decent progress because now I can’t hide behind “other things to do”, because now I’ve done them all. We’ll see.
day 19 — refactoring, version 2
So I decided to rethink how the data looks, so I’m now rewriting most of the app…
You may not believe it, but it is the truth, I am once again redoing the data structure of my app. They said it couldn’t be done, they said it shouldn’t be done, they said why they hell would you want it to be done. But alas, it is being done. I was looking at how all the editing will happen and really didn’t like how the list item properties were being stored. Having a map within a map was really confusing and was becoming difficult to work with. Not that I’m going to build 101 features into the app soon, but if I do it now, at least I will have some decent foundations. I don’t want to get to a point where I realise that the data should be redone and decide that it will be too much work to do it. I don’t want to have to work with messy code and weird data relationships if I can avoid it.
So where does that leave the state of the app now? I’m currently about 1/4 the way through refactoring and I’m honestly not sure how it is going to turn out. I’ve already had to redesign one UI component to better allow for the creation of different objects dynamically. I’m confident I can achieve this, and I’m confident that it will be beneficial in the long run. Hopefully I’ll be able to make some progress tomorrow, because I don’t think the rest of today will be too fruitful.
Now for some more technical details on how I will be restructuring the data:
Current UserListItemField class:
String id
String name
String type
List<dynamic> options
New UserListItemField class:
String id
String name
String type
New UserListItemFieldOptionSelect class:
extends UserListItemField
List<String> options
New UserListItemFieldPriority class:
extends UserListItemField
Map<String, int> options
New UserListItemFieldStarRating class:
extends UserListItemField
int color
Also making changes to the UserListItem class so the list of properties now takes in UserListItemProperty objects:
UserListItem class:
Map<String, Map<String, dynamic>> properties --> List<UserListItemProperty> properties
UserListItemProperty class:
String id // same as id from UserListItemField
String name
String type
dynamic value
I won’t go into the rest of the child classes of UserListItemProperty but I think the idea is relatively clear, I’m trying to make the data as readable as possible without making it too complicated. I think I’ve come up with a good solution, at least better than what I had before. I’m still not sure about the naming of fields and properties. On one hand I want to keep them the same, but on the other hand I feel like that will make things more difficult to understand and code harder to debug. Overall I’m happy with my solution, let’s just hope it works as intended.
My focus for tomorrow is to implement this new data structure. I’m hoping it won’t take more than a couple days because I am really running out of time here.
day 20 — that went swimmingly
The data is now nicely structured, until it isn’t.
Hopefully this is the last time I will decide to change the structure of my data because although it went pretty well, it was a pain and cost 2 days of development work. Looking at the code changes, I am glad I made the switch to a greater number of classes. I was already using a fair few classes for the list, list items, and list fields, so it really did make sense to expand those using inheritance and also add a new class for list item properties. The data is now much more readable and I’m not using map lookups to find values. It also looks a lot less hacky and unclean, I’m not having to initialise variables with empty strings as much as before and I can reference fields and properties using a single id.
My progress today was not really in the forward direction in terms of app features and functionality, but I was very happy with how much progress I made with my code refactor. It’s pretty much at the point it was 2 days ago. From what I can see, everything is working as is from before I changed the data so I will call that a success. Honestly I did think it would take me much longer than it did.
My focus for tomorrow will be to complete the list item editing. I technically can edit the user list and its fields, and the new and updated fields do carry over when I’m adding new list items, but the updates don’t carry over to the existing list items. It will likely be a bit of a pain working that out but I’m confident I’ll be able to get it done tomorrow.
day 21 — happy days
I’m not going to complete exactly what I had intended but I’m very happy with the work I’ve done.
I have come to the realisation that this app will not be complete, at least by the definition of complete outlined at the beginning of this month. I still believe that the app will be complete, but to a lesser extent. The app will have complete local functionality. You will be able to create a user list and add items to it. You will be able to add, delete, and edit the list fields, and you will be able to edit all the properties of a list item. I feel like that is a pretty decent first app, especially one that has been developed over the course of 25 days, in Christmas season, while having a full time job. Of course I still have work to do as the app isn’t even at that point yet, but I am very confident I will be able to reach that point.
Today I did complete what I set out to and new user list fields are now being added to each exisiting list item. I still have to complete the same process for removing a field and editing a field, but I don’t think that should be too hard. My focus for tomorrow is to complete these.
day 22 — stagnation
The last 2% is the hardest to get, that’s why they leave it in the milk.
Really, whether it’s in the milk or not, the last 2% of a project always seems to be the most difficult for me to complete. Other aspects may be almost as difficult, but I always find it hardest to actually finish a project. I’m not sure what the exact reasoning behind this is, but I think it may be a combination of multiple things. The last few things to do are usually fairly small but can also be things that have been left until last because they aren’t what I want to do. If they are somewhat trivial tasks, I may leave them for last because I think they will be easy to complete. Another reason may be due to my knack for creating more things that I could do for the project, but might not actually be in the scope that was originally laid out. I am always thinking of ways to improve and increase the functionality of apps I develop which means the project exhibits some scope creep. Honestly, I think my reluctance to working on the final part of a project could be any combination of these things. Some ways I have been able to combat this in the past was to produce a list of actual requirements for finishing the project vs nice to haves. There are always going to be tasks that need to be done, and tasks that can be left for later. I need to separate these clearly so I know exactly what I have to do for these last 2 days.
As you may have guessed, the progress I made today wasn’t too great. I was pretty resistant to any form of work on the app. I did finish implementing the edit field function like I said I would which was decent. I now realise I said I would do the deleting a field as well, didn’t quite get that far. I did spend some time looking through the app to find code duplication that could be contained in functions available to more than one file, or new classes I could create. There was a fair bit I could cut out by having separate functions that do similar things. But this is a nice to have, not a necessity.
Tomorrow I need to start off with creating a list of what has to be done. Then I can go from there.
day 23 — minor movement
As far as progress goes, today was not a good example.
It was very difficult to do anything today. I really felt like I couldn’t be bothered doing anything vaguely app related. This was a shame because only a few days ago I was feeling great, making progress, and loving every minute of the work I was putting in. Today I just couldn’t find any rhythm. I made a few minor changes to the app here and there but very little was actually completed.
I did create a list of what needed to be completed to call my app a version 1.0. It really isn’t a lot more work and I’m frustrated with myself that I can’t just spend a couple hours doing it. After I wrote down what I needed to do, I thought to myself “this really isn’t that much”. Then I proceeded to spend almost no time working on it and am now feeling disappointed.
The new requirements to be able to call my app a version 1.0 complete are as follows:
- display all data types on the list item card
- ability to have date / time / web link fields
- ability to edit date / time / web link fields
- ability to sort list items
- validation for creating a list
- validation for creating a list item
- alerts when removing fields and field options
Not a whole lot of heavy work I know. So why is it so hard to get it done? Am I being too hard on myself or am I justified in my self frustration?
My focus for tomorrow is to complete these tasks. It really isn’t a lot of work and I don’t feel like doing much on Christmas Day.
day 24 — it’s beginning to look a lot like app-mas
So close but yet.. no actually just close.
That last minute rush really kicked in. Today was the complete polar opposite of the previous 2 days because I actually got some things done. I was able to get out of work much earlier due to Christmas Eve and what not so I spent the spare time working on my app. The list I wrote up from yesterday, pretty much ticked everything off. The last one I’ve yet to complete is the sorting of list items. Really it’s a nice to have feature but I want it to be included in the version 1.0 so hopefully I can spend a little bit of time on it tomorrow.
Some of the tasks did actually get culled. I realised that web link fields may be difficult to utilise if I don’t include functionality that allows users to share web pages directly to the app. So I decided to leave that for later. I also decided against validation for creating a list item. I want the app to be as customisable as possible so don’t want to restrict users from not being able to leave a field blank. If that’s what they wanna do, they can. I did leave in validation for the list item and made sure that the list always has a name because that seems pretty logical.
Like I had anticipated, all the tasks were pretty easy to complete. They didn’t even take that long. A few hours work and I had knocked them all off and was feeling great. Maybe I would have an app ready to go by tonight. Not quite the case but I am very happy with the results of today. I haven’t thought about the next steps for the app but I’ll give that some more thought when Christmas is over.
day 25 — the finale
Pens down, the exam is now over.
What a month, or about 80% of a month. I’m gonna wrap things up a bit here but I’ll also do a longer reflection / evaluation of the 25 days a bit later, after I’ve had time to properly collect my thoughts. I am really proud of myself for what I have been able to achieve in such a short time. Although I was pretty confident when I began this challenge, I wasn’t actually certain that I would first of all, actually complete an app, and secondly, even work on the app every day. I began this challenge in probably the busiest month of the year, and to make it even more difficult, plenty of COVID things were ramping up here in South Australia. I also still had to go to work full time throughout this month with no time off. So even though the app doesn’t quite have the number of features I had initially planned, I am very happy that I have a usable app that I built by myself. I also learnt how to use Flutter, basically starting from scratch with very little prior experience.
So let’s take a look at what I aimed to achieve and what I actually did achieve:
What I had planned on day 2:
- user authentication and log in
- creating a user list
- create a user list from template
- create a custom user list
- edit / add / delete a user list item
- delete a user list
- sync data across multiple devices
- share lists with another user
- allow users different permissions
What I achieved by day 25:
- creating a custom user list
- editing the fields of a user list
- delete a user list
- edit / add / delete a user list item
- save data locally
- ability to add 9 different custom fields
Not the greatest app and definitely not going to win any awards, but for sure a good foundation. Considering I also restructure my entire database twice, I think my progress was pretty impressive. I’m not sure how many hours I would’ve spent working on the app, but I would estimate that I spent at least 1.5 hours a day. Some days I spent more like 4 hours, some days I spent about 10 minutes. Let’s just say that it took me about 40 hours to get this far, I’d be happy with that. An entire work week and this is what I have to show, not too bad at all.
Like I mentioned earlier, this is just a brief reflection on what I’ve achieved throughout my 25 days of app-mas. I am planning to write another article that goes into more a detailed evaluation of my progress and really gets into how I felt throughout, and now that I’m finished. I’ll also talk more about my thoughts on Flutter as a mobile app framework and my plans for the future.
If you’re reading this on Christmas that is pretty wild and hope you have an enjoyable day. If not, I still hope you have an enjoyable day. For anyone who has actually read all the way to day 25, I appreciate and respect you for hearing me ramble about very low quality content for 25 days.