Monday, March 31, 2025

Monthly Recap - 2025-02 February

February was a slow month for personal projects. The trend from January not only continued, but picked up speed. A lot of work from my daytime job, several (if not most) nights spend working overtime. A few bright spots, but an otherwise very workaholic kind of month.

Here is a short summary.


Achievements

Professional life

Continuing to expand an Agile movement within my daytime job was a very intensive activity. I once again had to work overtime several nights.

It paid off in terms of expanding the amount of Scrum teams we have, and receiving a green light to continue with this process even though the organization at large would still lag behind several months. Doing the right thing sometimes can be very time consuming and tiresome.


Continued work on new personal project

The development for the third project in the First Steps Into AI Engineering continued, although at a slower rate than I would have liked.

Although it is taking longer that I wanted, I am rather proud of the development. I have been able to apply TDD for a significant part of it, and I am writing more unit tests than I expected to. I have also created user stories for this one, something I had not done since SnakeJS, back in 2023. Although I thought about using LLMs to generate them, like I did back then, in the end I decided to just write them myself, which was a nice exercise.


Courses

In February I went back to taking online courses about technical subjects. This is something I had done through most of my adult life, but that I stopped during 2024 to try and focus more on building personal projects. While it was very nice and productive to shift the focus, and it lead to my most productive year ever, I admit I had been missing to dedicate some time purely for learning. I guess once a nerd, always a nerd!

I picked up some refreshers about Docker and Kubernetes, after more than half a year working professionally on purely legacy systems. Although it is a topic I am fairly confident about, I feel it will be useful to slowly pick up speed on this, as I expect my next phase of AI Engineering projects to be much more involved in containerization.


Downpoints

Slow progress on personal studies

Once again, my personal studies habit has suffered the most. I went more slowly in the career studies than I did in January, with some weeks having to do no progress at all, but I was still able to advance in the book I am studying, The Captain Class.

For hobby studies, once again I did not even choose a new book to pick up.


Plans for next month

February was a really hard month for me, in terms of personal pursuits. I started March intending to at least mitigate that and increase the amount of time I could dedicate to some areas.


Monthly Recap - 2025-01 January

January saw a shift in the balance of personal work vs professional work for me. As my daytime work increased in demands, I reduce the amount of time I could spend in personal projects. Having to work extra hours sucks, but sometimes we have to pay the price to achieve things that others think are not possible.

Nevertheless, and with a lot of delay, I will post here a short summary of what went on this month.


Achievements

Professional life

Sometimes we land in some really crazy places. In my last career move, I changed from a good role in a more or less deadend organization, to a role in a very troubled part of a very good organization. While I do not regret the move, I have to be honest and say that some things in this change were a challenge. The biggest one of them was having to work in a waterfall organization.

It is 2025, and having to work with waterfall. Hard to put in words without sounding too negative, but there are a few things that we, as an industry, have definitely, unquestionably, learned. And one of them is that waterfall does not work.

This is all to say that one of the high achievements of the month was being able to establish the start of an Agile structure at work, and implementing the viable subset of Scrum for that environment. This was immensely rewarding, but at the same time it took its toll. It required many nights of overtime work to deal with all of the inefficient bureaucracy that the waterfall processes demanded, so that during the day the team could do actual, meaningful, real work. It was demanding and tiresome, but it was worth it.


Released Chargen version 1.3.1

Chargen is one of my personal projects exploring AI Engineering. I have written a blog post about it. While most of the development happened last year, in January I released a new version, Chargen 1.3.1, which fixed the initial display of the application at startup.

The display issue happened because of a missing file in the packaged jar (and a not very smart implementation of loading it), which led to the part of view that holds the generated character avatar not being considered when calculating positioning of the elements. It was fixed by adding the missing file as a resource, and changing the corresponding loading logic.

I do not expect to do a whole lot more of development for Chargen, but it remains a fun and insightful application to have built (and a sometimes useful one - I still intend to write a blog post about this in the future).


Started work on new personal project

While I can't say much about it right now, as it is still under development and not yet revealed, in January I started working on the third project in the First Steps Into AI Engineering series. This remains in active development, and I expect to finish (and reveal) it sometime in April.


Downpoints

Slow progress on personal studies

The part of my personal work that has suffered the most in the past few months has definitely been my personal studies habit. In January, I made slow, though consistent, progress on the career studies book, The Captain Class.

The hobby studies, however, remained stagnant. After finishing Brave New Words, I did not even choose the next book to pick up.


Plans for next month

Due to the slow progress in personal projects during January, I started February with the goal of mostly continuing with the current efforts, without much hope of picking anything new.


Wednesday, January 29, 2025

Monthly Recap - 2024-12 December

December of 2024 marked the end of what was a very intense year for me, professionally. Despite slowing down at the end of the month to rest and reflect on everything that happened in the year, I was able to attend one of my favorite events in person, release several versions of my most recent personal project and reach significant milestones in personal studies.

Here is a summary of it all.


Achievements


TDC 2024-6 Porto Alegre

The Porto Alegre edition of The Developer's Conference (TDC) of this year took place between days 4 and 5 of December, at the usual location of Uniritter's campus. I have written several times about how I always try to attend each edition, and to be onsite whenever there is a Porto Alegre edition. This year was no different.

Though this edition had a smaller, more focused approach with less tracks and talks, it was still a very nice experience to be there. Reconnecting with colleagues, meeting new people and sharing ideas is always amazing. I have written a blog post about attending this edition, Event: The Developer's Conference 2024-6.


Chargen releases

Chargen is my second personal project focused on exploring generative AI capabilities. In December, I made three new releases of it:

  • 1.1.0: added several CLI options on startup to configure things such as server ports, model and temperature to be used.
  • 1.2.0: added streaming text when creating character biography instead of waiting until entire biography is complete before displaying on view, as well some improvements to UX by blocking certain actions when they should not occur.
  • 1.3.0: changed main view to group character infos into a form section, as well as several minor improvements to code quality.

With these releases, I consider the initial scope I wanted to have for Chargen completed. I might make new releases for bug fixes or small improvements, but for now I will shift my main development focus to a new project.


Personal Studies

With regards to my personal studies habit, I reached milestones for both career and hobby studies.

For career, I picked up a new book to study. I chose The Captain Class, by Sam Walker. I have been interested in leadership for several years now, and I found the premise of the book interesting. Also, it discusses in depth several of my sports idols, so it should also be a fun ready, in addition to its insightfulness.

For hobby, I finished Brave New Words, by Sal Khan. While not as impactful as the one I had read previously, CoIntelligence, I thought Brave New Words went well beyond the general perception of it being merely an advertisement stint for Khanmigo (Khan Academy's AI tutor system). It contained a lot of heartfelt and insightful analyses and ideas. I am not sure yet if I will take the time to write a full review of it, but I certainly recommend it to anyone who is interested in how AI will continue to shape our future.


Plans for next month

For January, my expectation is to start slowly and gradually pick up speed for the year. I should be choosing a new book for my hobby studies to continue on from Brave New Words, this time most likely not being something AI-specific (though that is still to be defined).

Other than that, I will start working on the third project in the First Steps Into AI Engineering series, hopefully having the initial release within the month. But for this one I want to take more time and do something a little more polished than Chargen was, as I think its use case is stronger and more useful.


Friday, December 27, 2024

Event: The Developer's Conference 2024-6 Porto Alegre (onsite)

The Developer's Conference (TDC) is arguably the most important technology event for software developers in Brazil. It is regularly held around four to six times a year, each time in one of the recurring host cities (São Paulo, Florianópolis and Porto Alegre being some of the most common ones). The talks presented in each edition span a wide variety of topics, giving a great overview of the technology ecosystem as a whole. 

Since 2020, most editions have also been transmitted online, either in a fully remote format or in a hybrid one. I have written in a past blog post about how I have been a regular attendant ever since my first participation in 2019.


Porto Alegre edition for 2024

While most of the times I attend remotely, whenever there is an edition in Porto Alegre I try to be onsite for the event. This was the case for the final edition of TDC in 2024, which took place in Porto Alegre between December 4th and December 5th. 

Going back to the familiar Uniritter campus and meeting in person with some of the most important figures of the national software development scene, as well as colleagues from the past whom I had not seen in years, is always an amazing experience!


Summit AI format

The Porto Alegre edition for this year was in the new "Summit AI" format, in which there are only two days of event and three main stages (plus several other venues such as stands and digital rooms), with all of the talks focusing on the topic of AI. Overall, there were 4 editions in this format this year, with 2 other (in São Paulo and Florianópolis) using the more traditional tracks format. 

While I understand the need for a more frequent and deeper discussion about AI, given the overwhelming speed with which it took hold of the conversation in the tech industry since ChatGPT's launch on November 2022, I admit that I prefer the traditional format, with more tracks and thus more talks and a wider variety of topics being discussed.


Mute talk format

One feature that was new to me, although I believe it was already used in previous editions this year, was the use of multiple talks happening in the same place at the same time, with headsets given to the attendants that would allow them to choose which talk they wanted to listen to. 

While it allowed to easily switch talks whenever there was a dull moment in one (very reminiscent of the online experience of switching rooms in the streaming platform with a single click), I did not find this novelty to be particularly helpful, from an attendant's point of view (although I'm sure it made the logistics much simpler). I also thought that the different talks interfered slightly with one another, as a loud ovation would sometimes interrupt a speaker mid-sentence when one talk ended while the other was still in progress.


Sessions

These were the talks I attended:


Day 1: 2024-12-04

  • Nova Indústria Brasil: as ações da Finep para apoiar o desenvolvimento de IA no país. (New Industry Brazil: Finep's Actions To Help The Development Of AI In The Country)
  • Inovação no Varejo: A Nova Era das Lojas Automatizadas com IA (Innovation In Retail: The New Age of Shops Automated With AI)
  • Inteligência Artificial a Serviço do Farmacêutico: Consulta Interativa de Bulas de Medicamentos (Artificial Intelligence At The Service Of The Pharmacist: Interactive Consultation Of Medicines Leaflets)
  • Reimagine o desenvolvimento de software com IA generativa (Reimagine Software Development With Generative AI)
  • LLMonsters: desafios de GenAI em produção (LLMonsters: Challenges Of GenAI In Production)
  • Discovery Kanbanizado - O que garantir antes do compromisso (Kanban-ized Discovery: What To Guarantee Before Committing)


Day 2: 2024-12-05

  • Potencializando a Agilidade com Inteligência Artificial: Transformando Decisões e Processos em Tempo Real (Powering Agility With Artificial Intelligence: Transforming Decisions And Processes in Real Time)
  • Uso de Agentes baseados em LLMs como suporte a equipes (Usage Of LLM-Based Agents As Support To Teams)
  • Aplique AI e deixe agir: como implementar agentes de IA generativa (Apply AI And Let Act: How To Implement Generative AI Agents)
  • Engenheiro de Prompt: A Arte de Fazer Perguntas que Movem a Era da Inteligência Artificial (Prompt Engineer: The Art Of Asking Questions That Move The Age Of Artificial Intelligence)


Takeaways

Attending this edition was a very good learning experience. I was able to hear about the implementation of LLMs for real use cases and in production scenarios - as someone who has been following closely this area, and who has been implementing several personal projects using LLMs, this was extremely insightful. I was also able to get a good overview of agentic AI, a subarea that I hope to dive deeper into in the near future but that I have not yet explored much. 

Finally, I was able to meet a few people whom I had not seen in a long time, which is always nice and heartwarming. As always, I intend to continue attending every edition of TDC that I can, and I hope to next year see more editions happening in the traditional tracks format instead of the Summit AI one.


Sunday, December 22, 2024

Monthly Recap - 2024-11 November

November was a month with a lot of behind-the-scenes work. While I did release the first version of a new project and finished the study of a book, most of what I did was the kind of inglorious, but very much needed, work that does not generate big headlights when it is finished. Nevertheless, I am quite glad of all I did this month.


Achievements


Work on personal projects

I did some small updates to my existing personal projects. For JenAI, the most current one, I released version 1.7.1, which introduced a third-party library to parse command line options, instead of handling that with custom code. I also used this opportunity to add unit tests for all supported command line options so far, before making the change. As Michael Feathers says in Working Effectively With Legacy Code, "Cover and Modify".

Other than that, I added a CONTRIBUTING.md file with guidelines for contribution to all my currently maintained personal projects (example). While the guidelines themselves are very simple, and I am only accepting very specific types of contributions, I like the idea of making them very clear and explicit in the repository. This is a further step towards adhering more formally to open source practices, beyond adding an open source license (all my projects are released under MIT license). Hopefully I will be able to continue adhering more and more, as I plan to get more involved with the community both in my daily job and in my personal projects.


Chargen

Chargen is an open source desktop application to generate fantasy character avatars and biographies, based on basic info and attribute points. It is the project I picked up after finishing the initial scope for JenAI, and a part of my First Steps Into AI Engineering roadmap. I have written a blog post about it, Project: Chargen. In November, I released the initial version, 1.0.0, which covers the basic functionality: after the user inputs infos such as name, class, alignment, etc. and attribute scores for a character, the application allows the generation of an avatar and a biography for it, using local generative AI models. It uses an LLM model with an OpenAI API-compatible server and a Stable Diffusion model.


Finished studying Working Effectively With Legacy Code book

This month I finished the study of the book Working Effectively With Legacy Code, in the context of my personal studies habit. I had been studying it for almost half a year, as it is a large book and I had some pretty busy times along the last months. I read it both by myself, in my personal studies, and with my colleagues at work, in a book club format. Despite the book being quite old by now (it is from the early 2000s), it was a very productive read, and I learned several techniques and names for techniques I already knew. I probably won't be writing a review for this one since the content is so technical and dense. Overall, it is a book I can highly recommend to any software developer who cares about their craft, regardless of ever working with legacy code.


Plans for next month

I am writing this recap already deep into December, so it does not make much sense to talk about plans for it. However, here are some general lines of work that I intended to follow as I wrapped up November.


Finish Chargen

Just as it was with JenAI, the initial version of Chargen is functional, but not particularly amazing. There are several aspects of it I want to improve. 

I want to use streaming text to generate biographies instead of blocking the application until the text is complete (leveraging what I learned by implementing streaming responses feature on JenAI). I also want to group the form where the user enters the information about the character, to make it stand out more in the UI and be clearer that this is where the user is expected to fill out the fields. And finally I want to do some minor enhancements on both the functionality (adding checks and validation to guarantee all fields are filled before trying to create anything) and the code quality (adding more unit tests, refactoring, moving things around into a better architecture, etc.). 

I expect to finish all I want to do in Chargen during December, so that next year I will be free to work on other projects that I already have lined up.


Finish hobby book

I expect to finish the study of the book Brave New Words in December. This is a book by Sal Khan (founder of Khan Academy) about the impact that GenAI will have (and is already having) in our society, with a slight focus on education. I am enjoying it greatly so far, as it is an insightful book about a topic I am following with great interest. If all goes to plan, I should finish it in the last week of December, and pick a new one in early 2025.


Thursday, November 28, 2024

Project: Chargen

Description

Chargen is a desktop tool written in Java to generate images and biographies for fantasy characters based on their skills.

I wrote a sketch version of it around May of 2024, and released an official version in November 29th, 2024.

The application assumes you have an LLM server running on your machine (this is a deliberate choice), on port 8080 (I plan to make this configurable in the near future), and a Stable Diffusion server for image generation also running on your machine on port 7860 (should also be configurable in the near future). The application presents a graphical interface for entering the information about the character, such as their name, class and skills, and two buttons: one to generate an avatar image for the character, and the other to generate a textual biography. Both use the information entered about the character to generate appropriate outputs. The biography and avatar generated can be saved to disk as text and image.

Chargen was developed in the spirit of a proof-of-concept, so that I could explore interacting with two different generative AI tools in the same application and learn from this experience. It is not intended to be used by a general audience.


Context

I developed Chargen as I was exploring how to build systems using generative AI technologies for the first time. I blogged about the set of 4 projects that came out of this exercise in my post entitled "First Steps Into AI Engineering". Chargen was the second of these 4, and the first one to deal with image generation.

As described in the post just mentioned, for Chargen I wanted to write most of the code myself, without relying too much on frameworks, so as to get a better feeling about working with these models. It is also intentional to explore only open and local AI models, as it is my intention to find out how far can we go working only with models that can be fully personal and owned by its users.

For Chargen I chose to work with text generation and image generation as separate tools instead of using a LLM that also has image output, as those are not yet very widespread as open source models.


Highlights

The biggest benefit of this project to me was learning how to generate images programmatically with Stable Diffusion. Although I had already used it quite a bit, it had always been through some provided UI, such as the classic text-generation-webui by Oobabooga. Getting used to access this service through code opened up my mind to a lot of cool ideas that hopefully I will be able to explore in the future.

Another good point was getting familiar with using LLMs as a single-purpose tool. I have always liked Simon Willison's analogy of seeing LLMs as a "calculator for words", and I think that one of the reasons why this requires some mental effort to achieve is that the usual way we interact with LLMs - as a chatbot - steers our thinking towards the opposite direction. We get lost in the simulation of emotions, the rhetoric and the stealthy handling of conversation state, and that makes it hard to see the system we are interacting with as something that is just processing some text to generate other text. Using them in the context of Chargen, in which every request has a very specific type of output and fulfills one very specific need, without any context or state from previous messages, helps the vision of LLMs being a calculator.

Chargen also gave me an opportunity to work with prompts in a more nuanced way. When developing a simple chatbot, usually you only think of a good system prompt to guide the tone of the conversation, and from that point onwards just relay to the model the state of the conversation plus the new message from the human interacting with it. In Chargen, however, both prompts (for generating the avatar and the biography) were tailored to produce a very specific result, almost as a function. Thinking about how to integrate the user input (in the form of the character's attributes) with the function-like prompt was an enlightening experience.

One thing that ended up being challenging was coming up with a prompt to generate good avatars that did not fall into the uncanny valley. I believe this was mostly because I chose to restrict myself to working with the base Stable Diffusion 1.5 model, which is quite old by now and nowhere near being among the best ones you can find even in the open source landscape. The fact that I did not want to include any trademarketed words in the prompt also had a big impact. I could not find a prompt that would generate excellent images, so I settled for one that would generate reasonably acceptable ones, most of the time. For any application looking for more robust results, this should be easily fixable by changing the two major points I mentioned.

For this project I wanted to work only with Java and focus on learning about interacting with generative AI models, so I picked a GUI library that does not generate the most beautiful applications ever. Swing had the advantage that it requires no external dependencies, that it is fairly straightforward to use and that I had already used it in several other projects in the past. But neither the code to create the views nor the views themselves end up particularly beautiful, so for any serious attempt at creating a similar application for a wider audience, a better GUI engine should be chosen. I do not intend to spend too much time improving the UI either.

Chargen requires two generative AI models to be running on your local machine at the same time. That makes it almost impossible to expect anyone else to run it by themselves to check out, so I am not investing into making it too user-friendly. Instead, I see it as a successful proof-of-concept, that gives good indications on how to build a similar system for widespread use if desired - one that should definitely then consume remotely hosted models. I was a little surprised to discover that my machine handled pretty well running all the required setup to make Chargen work - but then again, I am a software developer interested in AI that also likes to play games on his PC, so my machine is not really an average end-user's one.


Future Expansions

As mentioned previously, I do not intend to spend too much time improving Chargen, as I already reaped most of the benefits I expected from it in the initial development. It could certainly benefit from some work to make the UI more pleasant and a deeper research for image generation models that could put out better results, but I am content with the current state as I do not expect it to be used by other people.

I do intend to make it slightly more customizable, though. Especially by allowing for a similar configuration through command-line options as JenAI has. The most important parameters being the ports for the LLM and the Stable Diffusion models. I will have to make the "model" property configurable in order to support ollama as a backend as well. I might make the prompts configurable in the future, but do not plan to do so as of now.

Another possible expansion would be to add more constraints to the character attributes, such as a maximum number of total points to be distributed, or drop-down options for details that can be restricted to a set. If I do implement this in the future, I would prefer to make it an optional feature instead of replacing the current, freer, functionality. I do not see a very strong reason to restrict the possibilities that the generative AI models give to a creative user in this context.


Setup

Although Chargen is not one of my portfolio projects (which have a fixed set of quality standards I expect to maintain through their entire lifecycle), I did configure most of the foundations I use for those.

I use Github Actions to generate a new release for Chargen whenever new code is pushed into the main branch and alters relevant core files of the project.

I have a changelog file, a file with guidelines about contributing and an architecture.md file (an idea I adapted from this great article), beyond the usual readme file as documentation.

As this project was done in an exploratory and proof-of-concept approach, I did not include automated tests. This is the main point of departure with regards to the quality standards I expect from my portfolio projects.


Links

Source code: Github

Executable: Releases


Tuesday, November 5, 2024

Monthly Recap - 2024-10 October

October was a quieter month than September for me. There were less events going on, so I could focus more on my usual habits and routine. A few interesting movements happened in my main job that are not yet ready for disclosure, but that should be officially announced in the next few weeks. I was also able to get a fair bit done in my personal projects. Here is a short summary of what happened:


Achievements


JenAI

JenAI is the main project I have been working on in my spare time, I described it in detail here. I was able to complete the initial scope I had planned for it in this month, with the implementation of streaming responses. I also added another minor (but very useful) feature, and made some enhancements to the overall quality of the project. To put it in specific terms:

  • Release 1.6.0: Added Streaming Response feature. With this mode, the response from the model is streamed continuously as it is generated, which ensures a quicker feedback and overall better experience. It also prevents the interface being locked for several minutes (if using a very large model, for instance) while the response is being computed. This release did not remove the previous default mode (block response), which can still be activated with a command line option on startup.
  • Release 1.7.0: Added Temperature feature. This released added a new command line option to set the temperature to be used by the model when computing responses. By tuning the value used for this option, it is possible to determine how creative/random the answers will be during the conversation.
  • Quality improvements: This month I started adding unit tests to the project. Since the project started as an exploratory exercise, which I used to learn how to use LLM server APIs, I did not feel the need to add unit tests to it (quite to the contrary, for explorations they only get in the way). However, as my understanding of how to use the APIs grew and JenAI incorporated more features, it slowly shifted to a project I would like to add to my personal portfolio. For that, I consider it mandatory to include unit tests, so I started adding them this month. It has been a nice experience, as it has allowed me to see opportunities for better design and to apply some techniques I have been studying to deal with legacy code (and serves as a reminder that even your own recent code can be legacy if it does not include automated tests). Additionally, I have also added a CONTRIBUTING.md file with guidelines of how to contribute to the project and created new screenshots to use in the README, using the most recent version.

With the new additions done in this month, I consider the initial scope of JenAI complete. The most likely next step would be to incorporate running inferences directly within the project, instead of relying on having an LLM server running locally and using its API. For that, I will need to find a good and reliable Java library (I have no intention of implementing that by myself), and while I do have some candidates already shortlisted to investigate further, currently there is none that I know for sure would serve. If I do end up implementing that in the future, it would likely bump the major version of the project, and effectively start JenAI version 2. That is not something I intend to do before finishing at least three other projects related to AI, so there is little chance of it coming before 2025.


CoIntelligence book review

Earlier this year I read the book CoIntelligence: Living And Working With AI, by Ethan Mollick, as I have been fascinated with the potential of generative AI to have a profound impact in every part of our culture in the near-to-mid future. I picked the book as a hobby study in my personal studies habit. Ever since I finished studying it, way back in June, I have been working on a review for it. In October I finally got to write and post it. With this, I can now pick up the next hobby study book (Salman Khan's Brave New Words) and start it, as I had been waiting to get the review done to avoid mixing up the contents due to them talking about closely related topics.


Personal studies habit

September was so busy that I was not able to make much progress in my personal studies habit, as I mentioned in the monthly recap post for that month. With October being a quieter month, I was able to get back on track on this. I progressed nicely in the career study book I am working on (Working Effectively With Legacy Code), and I got to write the review for CoIntelligence, as mentioned just above.


Plans for November


Start next AI Engineering project

With the initial scope for JenAI done, I can start the next project in my First Steps Into AI Engineering series. I expect this one to have a shorter development cycle than JenAI, as I will reuse much of the API-related features and enhancements I did for that project into this new one. My current expectation is to have it in a state good enough to be made public by the middle of the month, and have it completed by the end of the month - though those are not really hard deadlines. I will be writing about it as I progress in its development.


Keep up with routine habits

Other than that, I intend to keep up the rhythm with my usual habits and routine. I am starting Brave New Words as the next hobby study book, and will probably finish Working Effectively With Legacy Code as the career study book in this month. Hopefully I will also be able to share more news about the developments in my daily job as well.


Monthly Recap - 2026-07 July

After a long while, in July I was able to once again have a very productive month with my personal projects. This years has been incredibly ...