<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: Dima Nikulin</title>
    <description>The latest articles on Forem by Dima Nikulin (@dimanikulin).</description>
    <link>https://forem.com/dimanikulin</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F813015%2F33037f87-00e3-4238-bfb3-b975fce68662.png</url>
      <title>Forem: Dima Nikulin</title>
      <link>https://forem.com/dimanikulin</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/dimanikulin"/>
    <language>en</language>
    <item>
      <title>What Content to Create and How to Publish It, Part 2</title>
      <dc:creator>Dima Nikulin</dc:creator>
      <pubDate>Tue, 06 May 2025 06:31:31 +0000</pubDate>
      <link>https://forem.com/dimanikulin/what-content-to-create-and-how-to-publish-it-part-2-49eb</link>
      <guid>https://forem.com/dimanikulin/what-content-to-create-and-how-to-publish-it-part-2-49eb</guid>
      <description>&lt;h1&gt;
  
  
  Overview
&lt;/h1&gt;

&lt;p&gt;In today's digital landscape, creating compelling and polished content is essential for capturing and retaining audience attention.&lt;br&gt;
This comprehensive guide offers invaluable insights and strategies for optimizing your content across various platforms.&lt;br&gt;
From refining your writing and formatting techniques to maximizing audience engagement and platform-specific publishing, this guide covers everything you need to know to elevate your content creation game.&lt;br&gt;
Whether you're a seasoned writer or just starting out, follow these tips and best practices to ensure your publications stand out in a crowded online space.&lt;/p&gt;




&lt;h1&gt;
  
  
  Size
&lt;/h1&gt;

&lt;p&gt;The publication should not be overly dense or difficult to read.&lt;br&gt;
When considering a typical piece intended for public consumption, I propose aiming for an ideal publication size of under &lt;strong&gt;2500&lt;/strong&gt; words.&lt;/p&gt;

&lt;p&gt;On the other hand, the size should not be too small, where it can be consumed in just one minute.&lt;br&gt;
I would suggest &lt;strong&gt;800&lt;/strong&gt; words as the smallest size for a publication.&lt;/p&gt;

&lt;h1&gt;
  
  
  No formatting symbols
&lt;/h1&gt;

&lt;p&gt;An important point to note is the absence of any formatting symbols in the publication, such as &lt;strong&gt;&lt;/strong&gt; or &lt;strong&gt;  &lt;/strong&gt;.&lt;br&gt;
These symbols may appear if you copy your content from another document format.&lt;/p&gt;

&lt;h1&gt;
  
  
  Citations
&lt;/h1&gt;

&lt;p&gt;There is a recommendation for &lt;strong&gt;citations&lt;/strong&gt; to be formatted as in-line links, with any recommended reading listed separately.&lt;/p&gt;

&lt;h1&gt;
  
  
  Tables
&lt;/h1&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2mz6a3empfe44f09zoac.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2mz6a3empfe44f09zoac.png" alt="Image description" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you use &lt;strong&gt;tables&lt;/strong&gt; in your publications, please make sure that columns with less content are placed towards the end of the table, and vice versa.&lt;/p&gt;

&lt;p&gt;Additionally, I suggest placing &lt;strong&gt;more important&lt;/strong&gt; columns at the beginning of the table so that readers will first encounter the most important information.&lt;/p&gt;

&lt;p&gt;Last but not least, I would suggest using tables as images, as many publication platforms do not fully support tables.&lt;br&gt;
Still, keeping the source of tables will provide you with the ability to update table images in case of a change.&lt;/p&gt;

&lt;h1&gt;
  
  
  Pictures
&lt;/h1&gt;

&lt;p&gt;Please notice a really important point: &lt;strong&gt;fewer&lt;/strong&gt; pictures mean &lt;strong&gt;fewer&lt;/strong&gt; views.&lt;br&gt;
Certainly, all pictures should be related to the text content and enhance its meaning.&lt;/p&gt;

&lt;p&gt;I suggest having a featured image as a title image. It might be interactive, like a gif.&lt;/p&gt;

&lt;p&gt;I would prefer &lt;strong&gt;album&lt;/strong&gt; orientation to be album rather than &lt;strong&gt;book&lt;/strong&gt; orientation. It will use the user's screen more efficiently.&lt;/p&gt;

&lt;h1&gt;
  
  
  Plagiarism
&lt;/h1&gt;

&lt;p&gt;Please note that readers prefer content to be &lt;strong&gt;100% original.&lt;/strong&gt;&lt;br&gt;
They expect &lt;strong&gt;0% plagiarism&lt;/strong&gt; or duplicate content, and all sources must be properly cited.&lt;/p&gt;

&lt;p&gt;When using a quote or definition from another source, it must be cited using an in-line link to provide attribution and enable readers to verify the information.&lt;/p&gt;

&lt;p&gt;You can use this &lt;a href="//www.copyscape.com"&gt;website&lt;/a&gt; to check for &lt;strong&gt;plagiarism&lt;/strong&gt;.&lt;/p&gt;

&lt;h1&gt;
  
  
  Make Proofreading
&lt;/h1&gt;

&lt;p&gt;&lt;em&gt;And yes,&lt;/em&gt; your content should not have any punctuation or syntax mistakes.&lt;br&gt;
Also, there should not be any formatting issues.&lt;br&gt;
To make it possible, you will need to &lt;strong&gt;proofread&lt;/strong&gt; the content.&lt;/p&gt;

&lt;p&gt;How do I do that?&lt;br&gt;
The best way to do it is to have it proofread by a human.&lt;br&gt;
It might be costly, and there is software to help you, such as &lt;strong&gt;ChatGPT&lt;/strong&gt;, &lt;strong&gt;MS Word&lt;/strong&gt;, or &lt;strong&gt;Google Docs&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Also, &lt;strong&gt;Hashnode&lt;/strong&gt; has an online proofreading option, so you can post there first.&lt;/p&gt;

&lt;h1&gt;
  
  
  Publishing on Multiple Platforms
&lt;/h1&gt;

&lt;p&gt;I publish my content on different platforms � seven for now.&lt;br&gt;
When I join a platform, the first thing I do is read the requirements on how to publish there.&lt;br&gt;
The content you publish should be relevant and applicable to the platform.&lt;br&gt;
For example, I don't use &lt;strong&gt;Facebook&lt;/strong&gt; to post programming stuff.&lt;/p&gt;

&lt;p&gt;All platforms suggest filling out the user profile before publication so people who read your publication can contact you if they are interested.&lt;br&gt;
Profiles on different platforms should be consistent with each other.&lt;br&gt;
Here, I use a link to one public profile on &lt;strong&gt;GitHub&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Usually, I first publish my content on &lt;strong&gt;Hackernoon&lt;/strong&gt; as they check my content thoroughly, and then I publish it on other platforms so it is well-checked.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0uhujh5zie5kag5wzlg6.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0uhujh5zie5kag5wzlg6.png" alt="Image description" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  Time and Frequency of Publication
&lt;/h1&gt;

&lt;p&gt;It is quite important to select the proper day and time for publication.&lt;br&gt;
I usually publish on Mondays and Thursdays, typically between &lt;strong&gt;10 AM&lt;/strong&gt; and &lt;strong&gt;3 PM&lt;/strong&gt; my local time, &lt;strong&gt;Ukrainian&lt;/strong&gt; time.&lt;br&gt;
It should definitely not be early in the morning or late at night.&lt;/p&gt;

&lt;p&gt;Also, please note that publishing on holidays may result in fewer views.&lt;br&gt;
This is applicable to summer as well; you will likely see fewer reactions.&lt;br&gt;
Additionally, if there is another important event on the platform at the time of your publication, you may lose views, although they may accumulate later.&lt;/p&gt;

&lt;p&gt;Regarding frequency, I publish one to two times per week to avoid overloading my readers and to ensure they don't forget about me.&lt;/p&gt;

&lt;h1&gt;
  
  
  Language
&lt;/h1&gt;

&lt;p&gt;I would recommend using &lt;strong&gt;English&lt;/strong&gt; where possible because it is the most widely known language.&lt;/p&gt;

&lt;h1&gt;
  
  
  Checklist
&lt;/h1&gt;

&lt;p&gt;As you can see, there are a lot of items not to forget about.&lt;br&gt;
That's why I use a checklist to help me remember important points.&lt;br&gt;
Here it is:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Is there a &lt;strong&gt;Headline&lt;/strong&gt;?&lt;/li&gt;
&lt;li&gt;Is the &lt;strong&gt;Headline&lt;/strong&gt; less than 150 characters?&lt;/li&gt;
&lt;li&gt;Is there an &lt;strong&gt;Overview&lt;/strong&gt; to start from?&lt;/li&gt;
&lt;li&gt;Are there &lt;strong&gt;Tags&lt;/strong&gt;?&lt;/li&gt;
&lt;li&gt;Is there a &lt;strong&gt;Table of contents&lt;/strong&gt;?&lt;/li&gt;
&lt;li&gt;Are there no formatting symbols?&lt;/li&gt;
&lt;li&gt;Are there no empty chapters?&lt;/li&gt;
&lt;li&gt;Are &lt;strong&gt;Definitions, Acronyms, Abbreviations&lt;/strong&gt; sorted?&lt;/li&gt;
&lt;li&gt;Is there no &lt;strong&gt;Personally Identifiable Information&lt;/strong&gt; (&lt;strong&gt;PII&lt;/strong&gt;)?&lt;/li&gt;
&lt;li&gt;Is there no &lt;strong&gt;TBD&lt;/strong&gt; and &lt;strong&gt;TODO&lt;/strong&gt;?&lt;/li&gt;
&lt;li&gt;Does it ask for an opinion?&lt;/li&gt;
&lt;li&gt;Has it been proofread?&lt;/li&gt;
&lt;li&gt;Is bold text used for keywords?&lt;/li&gt;
&lt;li&gt;Is italics used for conversation?&lt;/li&gt;
&lt;li&gt;Are all references current?&lt;/li&gt;
&lt;li&gt;Is the length under &lt;strong&gt;2500&lt;/strong&gt; words?&lt;/li&gt;
&lt;li&gt;Are there any pictures?&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>contentwriting</category>
      <category>tutorial</category>
      <category>community</category>
    </item>
    <item>
      <title>What Content to Create and How to Publish It, Part 1</title>
      <dc:creator>Dima Nikulin</dc:creator>
      <pubDate>Fri, 10 Jan 2025 08:59:32 +0000</pubDate>
      <link>https://forem.com/dimanikulin/what-content-to-create-and-how-to-publish-it-part-1-2hcj</link>
      <guid>https://forem.com/dimanikulin/what-content-to-create-and-how-to-publish-it-part-1-2hcj</guid>
      <description>&lt;h1&gt;
  
  
  Overview
&lt;/h1&gt;

&lt;p&gt;Mastering the Art of Publication:&lt;br&gt;
A comprehensive guide outlining key criteria for evaluating publications, common recommendations for successful content creation, essential publication structure guidelines, and must-have chapters.&lt;br&gt;
Learn how to optimize your publications for engagement and readability while ensuring effective organization and categorization through tags.&lt;/p&gt;




&lt;h1&gt;
  
  
  Criteria for Evaluating Publications
&lt;/h1&gt;

&lt;p&gt;Understanding the effectiveness of published works is paramount in today's digital landscape.&lt;br&gt;
Having posted numerous publications across seven different sites, I've identified several key criteria for determining the success and interest level of each publication:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Number of Views&lt;/strong&gt;: The total number of times the publication has been viewed is a primary indicator of its reach and impact.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Comments&lt;/strong&gt;: Engaging comments indicate that the publication has sparked discussion and resonated with the audience.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Likes and Reposts&lt;/strong&gt;: The number of likes and reposts reflects the level of appreciation and the desire to share the publication with others.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Savings into Bookmarks&lt;/strong&gt;: When readers save the publication into their bookmarks, it suggests that they find the content valuable and wish to revisit it in the future.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;By assessing these metrics, I can gauge the effectiveness of each publication and tailor future content to better meet the interests and preferences of the audience.&lt;/p&gt;

&lt;h1&gt;
  
  
  Common Recommendations
&lt;/h1&gt;

&lt;p&gt;Crafting compelling and impactful content requires adherence to certain guiding principles.&lt;br&gt;
When publishing, it's crucial to ensure that the content reads like a story rather than a mere collection of facts.&lt;br&gt;
It's immensely valuable to draw from personal experiences rather than relying solely on information gathered from books and online sources, avoiding mere reposts.&lt;br&gt;
Our content should reflect our own opinions, which might sometimes be provocative to stimulate discussion and even elicit strong reactions. For example, you can describe any pain points for yourself and for society.&lt;br&gt;
Additionally, the content should encourage readers to form their own opinions and engage in meaningful dialogue.&lt;/p&gt;

&lt;p&gt;Furthermore, it's important to be responsive to comments by addressing any questions or concerns raised.&lt;br&gt;
This interaction helps foster a sense of community and encourages further engagement with the content.&lt;/p&gt;

&lt;h1&gt;
  
  
  Publication Structure
&lt;/h1&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbf7hxxa9vfh8goeplru9.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbf7hxxa9vfh8goeplru9.png" alt="Image description" width="800" height="450"&gt;&lt;/a&gt;&lt;br&gt;
A well-structured publication enhances readability and comprehension.&lt;br&gt;
So when creating content, it is crucial to prioritize structure, especially for larger texts.&lt;br&gt;
The following guidelines should be adhered to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Paragraphs and Indentation: Ensure that paragraphs are used to maintain clear segmentation of ideas. Implement proper indentation to enhance readability.&lt;/li&gt;
&lt;li&gt;Headings and Subheadings: Utilize headings and subheadings to organize content hierarchically. Limit heading levels to three for simplicity and clarity.&lt;/li&gt;
&lt;li&gt;Lists: Integrate bulleted or numbered lists to present information concisely.&lt;/li&gt;
&lt;li&gt;Chapter Order: Recognize the significance of the order of chapters, following the conventions of scientific documents.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;By adhering to these guidelines, your content will not only be well-structured but also enhance the overall readability and comprehension of the larger text.&lt;/p&gt;

&lt;h1&gt;
  
  
  Must-Have Chapters
&lt;/h1&gt;

&lt;p&gt;Certain chapters serve as linchpins in the architecture of comprehensive documents.&lt;br&gt;
In any comprehensive document, the following chapters are essential:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Headline: This chapter serves as the introduction, providing a concise and compelling overview of the document's main theme or purpose.&lt;/li&gt;
&lt;li&gt;Overview: The overview chapter expands on the headline, offering a more detailed insight into the document's content, objectives, and key points.&lt;/li&gt;
&lt;li&gt;Tags: In this chapter, relevant tags are included to categorize and label the document, aiding in searchability and organization.&lt;/li&gt;
&lt;li&gt;Table of Contents: The table of contents chapter provides a structured outline of the document, listing its sections and subsections, guiding readers through the content.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Ensuring the inclusion of these must-have chapters will contribute to the clarity, accessibility, and overall effectiveness of the document.&lt;/p&gt;

&lt;h1&gt;
  
  
  Optional Chapters
&lt;/h1&gt;

&lt;p&gt;While some chapters are essential, others offer additional value and flexibility in content creation.&lt;br&gt;
I would like to note that the &lt;strong&gt;Alternative Headline&lt;/strong&gt;, &lt;strong&gt;Definitions, Acronyms, Abbreviations&lt;/strong&gt;, &lt;strong&gt;Introduction&lt;/strong&gt; and &lt;strong&gt;References&lt;/strong&gt; chapters are optional.&lt;/p&gt;

&lt;p&gt;Generally, there is no need for a glossary.&lt;/p&gt;

&lt;p&gt;If there are terms that the reader may not know, please explain them where and when they are mentioned.&lt;/p&gt;

&lt;h1&gt;
  
  
  "Headline" chapter
&lt;/h1&gt;

&lt;p&gt;The headline serves as the gateway to the publication, encapsulating its essence in a concise and compelling manner.&lt;br&gt;
I use &lt;strong&gt;ChatGPT&lt;/strong&gt; to assist me in generating headlines.&lt;br&gt;
Therefore, I copy the entire content into &lt;strong&gt;ChatGPT&lt;/strong&gt; and ask it to generate a headline.&lt;br&gt;
Please note that sometimes it may require a few corrections because it might extract a headline based only on a part of the content and not the entire text.&lt;/p&gt;

&lt;h1&gt;
  
  
  "Table of contents" chapter
&lt;/h1&gt;

&lt;p&gt;The table of contents provides readers with a structured overview of the publication's contents, facilitating navigation and comprehension.&lt;/p&gt;

&lt;h1&gt;
  
  
  "Overview" Chapter
&lt;/h1&gt;

&lt;p&gt;The &lt;strong&gt;overview&lt;/strong&gt; chapter typically offers a brief summary or introduction to the main topics covered in the document.&lt;br&gt;
It serves as a way to orient the reader and provide context before delving into more detailed information.&lt;/p&gt;

&lt;p&gt;Alternatively, this chapter is often referred to as &lt;strong&gt;TL;DR&lt;/strong&gt; - &lt;em&gt;too long; didn't read&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Similar to the previous chapter, I use &lt;strong&gt;ChatGPT&lt;/strong&gt; to assist me in generating the &lt;strong&gt;Overview&lt;/strong&gt;.&lt;br&gt;
Therefore, I copy the entire content into &lt;strong&gt;ChatGPT&lt;/strong&gt; and ask it to generate an &lt;strong&gt;Overview&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fb0uxw98hzdnjpfxbk740.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fb0uxw98hzdnjpfxbk740.png" alt="Image description" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  "Tags" Chapter
&lt;/h1&gt;

&lt;p&gt;&lt;strong&gt;Tags&lt;/strong&gt; for text documents are keywords or labels assigned to the document to categorize or describe its content.&lt;br&gt;
Tags play a crucial role in categorizing and organizing content, enhancing searchability and discoverability.&lt;br&gt;
These &lt;strong&gt;tags&lt;/strong&gt; aid in organizing and classifying documents, making them easier to search, filter, and retrieve later.&lt;/p&gt;

&lt;p&gt;I use these &lt;strong&gt;tags&lt;/strong&gt; to include on the platform where I am publishing.&lt;/p&gt;

&lt;p&gt;Once more, I utilize &lt;strong&gt;ChatGPT&lt;/strong&gt; to assist me in generating the &lt;strong&gt;tags&lt;/strong&gt;.&lt;/p&gt;

&lt;h1&gt;
  
  
  "Definitions, Acronyms, Abbreviations" Chapter
&lt;/h1&gt;

&lt;p&gt;Clarifying terminology is essential for enhancing reader comprehension and clarity.&lt;br&gt;
This chapter lists &lt;em&gt;Definitions&lt;/em&gt;, &lt;em&gt;Acronyms&lt;/em&gt;, and &lt;em&gt;Abbreviations&lt;/em&gt; in the form of a table.&lt;/p&gt;

&lt;p&gt;It consists of 3 columns:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Number&lt;/strong&gt;: Indicates the row number.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Abbreviation or Acronym&lt;/strong&gt;: The name of the Abbreviation or Acronym.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Definition&lt;/strong&gt;: Explains the Abbreviation or Acronym.&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;
  
  
  "References" Chapter
&lt;/h1&gt;

&lt;p&gt;Citing sources and references adds credibility and authority to the publication.&lt;br&gt;
It is recommended to include links at the point of mention.&lt;br&gt;
Additionally, a separate chapter for references in the form of a table is desired.&lt;/p&gt;

&lt;p&gt;The table consists of 6 columns:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Number&lt;/strong&gt;: Indicates the row number.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Name&lt;/strong&gt;: The name of the reference.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Source&lt;/strong&gt;: The name of the resource where it is published.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Release Date&lt;/strong&gt;: The date of release.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Author&lt;/strong&gt;: The content creator.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Description&lt;/strong&gt;: An additional field for details.&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>contentwriting</category>
      <category>documentation</category>
    </item>
    <item>
      <title>Detecting Architectural Gaps with Automation - Proposed Solution</title>
      <dc:creator>Dima Nikulin</dc:creator>
      <pubDate>Fri, 31 May 2024 11:37:56 +0000</pubDate>
      <link>https://forem.com/dimanikulin/detecting-architectural-gaps-with-automation-proposed-solution-35dg</link>
      <guid>https://forem.com/dimanikulin/detecting-architectural-gaps-with-automation-proposed-solution-35dg</guid>
      <description>&lt;h1&gt;
  
  
  Introduction
&lt;/h1&gt;

&lt;p&gt;In the ever-evolving realm of software development, the quest for a robust and seamlessly integrated solution stands as a paramount pursuit.&lt;br&gt;
This article embarks on a comprehensive journey into the depths of a proposed software solution, meticulously scrutinizing its architecture, integration strategies, and deployment modalities.&lt;br&gt;
Through this exploration, we illuminate the symbiotic dance between users and technology, offering a roadmap for architects, developers, and IT aficionados alike to navigate the labyrinth of a forward-thinking software solution.&lt;/p&gt;

&lt;h1&gt;
  
  
  The Context View for Standalone Application
&lt;/h1&gt;

&lt;p&gt;A &lt;strong&gt;context diagram (view)&lt;/strong&gt; defines the solution's boundaries and connections with third parties, such as external systems, users, and data.&lt;/p&gt;

&lt;p&gt;As shown in the context diagram above, there is an interaction between &lt;strong&gt;Users&lt;/strong&gt; and the &lt;strong&gt;Proposed Solution&lt;/strong&gt;.&lt;br&gt;
These interactions will be implemented using a &lt;strong&gt;UI web interface&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;For obtaining input, the solution interacts with &lt;strong&gt;Online&lt;/strong&gt; and &lt;strong&gt;Offline UML&lt;/strong&gt; tools using their &lt;strong&gt;API&lt;/strong&gt; to retrieve the initial &lt;strong&gt;Software Architecture&lt;/strong&gt; and to save the extracted &lt;strong&gt;Software Architecture&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;To access code, configuration, and the database, interactions with &lt;strong&gt;Version Control Systems&lt;/strong&gt; and the database are utilized.&lt;/p&gt;

&lt;p&gt;Finally, Report Storage is employed to save the outputs extracted from the &lt;strong&gt;Architecture&lt;/strong&gt; under analysis.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0fark3d7frj6ok89ocsg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0fark3d7frj6ok89ocsg.png" alt="Image description" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  The Context View for a Separate Step in CI/CD
&lt;/h1&gt;

&lt;p&gt;The sole distinction between the previous view and the &lt;strong&gt;Context View&lt;/strong&gt; for a &lt;strong&gt;Separate Step&lt;/strong&gt; in &lt;strong&gt;CI/CD&lt;/strong&gt; is the integration of the proposed solution with the existing &lt;strong&gt;CI/CD&lt;/strong&gt; pipeline.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fo922a83ffwagbonaggmc.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fo922a83ffwagbonaggmc.png" alt="Image description" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  Functional View
&lt;/h1&gt;

&lt;p&gt;The functional diagram below illustrates the high-level functional decomposition of the proposed solution.&lt;br&gt;
An agenda is provided below to explain the color coding used in the functional decomposition diagram.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5fdxbsw5srq7vqghnc66.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5fdxbsw5srq7vqghnc66.png" alt="Image description" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Integration Layer
&lt;/h2&gt;

&lt;p&gt;The function of the integration layer is to abstract and segregate the system from external components, enhancing system extensibility and modifiability.&lt;/p&gt;

&lt;p&gt;The following components are involved:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Online UML Tools Integration Point: This component integrates Online UML tools with the Processor.&lt;/li&gt;
&lt;li&gt;Offline UML Tools Integration Point: This component integrates Offline UML tools with the Processor.&lt;/li&gt;
&lt;li&gt;Version Control Systems (VSC) Integration Point: This component integrates Version Control Systems with the Processor.&lt;/li&gt;
&lt;li&gt;Databases Integration Point: This component integrates database configurations with the Processor.&lt;/li&gt;
&lt;li&gt;CI/CD Integration Point: This component integrates CI/CD tools (such as Jenkins, Bamboo) with the Processor.&lt;/li&gt;
&lt;li&gt;Reports Plugins: An engine designed to generate reports in a flexible manner and store them in an external report storage.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  User Interface
&lt;/h2&gt;

&lt;p&gt;The user interface function interacts with users in two modes: &lt;strong&gt;architects&lt;/strong&gt; and &lt;strong&gt;administrator&lt;/strong&gt; mode. &lt;br&gt;
It utilizes a web interface that is compatible with desktop browsers.&lt;/p&gt;

&lt;h2&gt;
  
  
  Data Layer
&lt;/h2&gt;

&lt;p&gt;The data layer function maintains the following types of data:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Architecture Baselines: This feature records the history of architecture changes, allowing users to track and view past changes. It is accessible for viewing from the architects' panel.&lt;/li&gt;
&lt;li&gt;System Configuration: This aspect encompasses a set of check configurations for processing. It also keeps track of configurations for report plugins. Changes to these configurations can be made from the architects' panel.&lt;/li&gt;
&lt;li&gt;User Configuration: This includes user profiles and access rights, which can be modified from the administrator panel.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Processing Layer
&lt;/h2&gt;

&lt;p&gt;The processing layer serves as a fundamental function within systems, tasked with processing input data to identify architecture problems.&lt;br&gt;
Configuration of this layer takes place through the architect panel, where checks against the input are initiated.&lt;br&gt;
Additionally, it collaborates with the reports plugins engine for report storage. &lt;br&gt;
Furthermore, the extracted architecture is preserved in &lt;strong&gt;Architecture&lt;/strong&gt; baselines, enabling architects to review it at a later time.&lt;br&gt;
It is worth noting that &lt;strong&gt;Machine Learning (ML)&lt;/strong&gt; might be employed during processing to enhance the quality of reports.&lt;/p&gt;

&lt;h1&gt;
  
  
  Deployment View
&lt;/h1&gt;

&lt;p&gt;The deployment view illustrates how a solution is intended to be deployed, encompassing its flows and the supporting components.&lt;/p&gt;

&lt;h2&gt;
  
  
  Deployment View - On-Premises
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8ztbayx2fyiojyf643fx.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8ztbayx2fyiojyf643fx.png" alt="Image description" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;On-premise deployment assumes the use of a single computing node for installation.&lt;br&gt;
The &lt;strong&gt;Database&lt;/strong&gt; component should be deployed first, as other components depend on it.&lt;br&gt;
Subsequently, the &lt;strong&gt;Processor&lt;/strong&gt; and &lt;strong&gt;ML components&lt;/strong&gt; are deployed once the Database component is in place.&lt;br&gt;
The &lt;strong&gt;User Interface&lt;/strong&gt; component, report plugins, and integration points are deployed in the final stage.&lt;/p&gt;

&lt;p&gt;The &lt;strong&gt;Database&lt;/strong&gt; component is deployed as a single DB instance with multiple schemas inside.&lt;br&gt;
The &lt;strong&gt;User Interface&lt;/strong&gt; component is presented as a web service, while the &lt;strong&gt;Processor&lt;/strong&gt; and &lt;strong&gt;ML components&lt;/strong&gt; are native processes built for the target platform.&lt;br&gt;
Reports plugins and integration points are designed as dynamic libraries that can be easily added, removed, and configured at runtime.&lt;/p&gt;

&lt;h2&gt;
  
  
  Deployment View - Cloud
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fd4itx97pcr9e20kdad7j.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fd4itx97pcr9e20kdad7j.png" alt="Image description" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Cloud deployment&lt;/strong&gt; involves the utilization of two computing nodes for installation.&lt;br&gt;
Due to the potentially high &lt;strong&gt;CPU usage&lt;/strong&gt; of the Machine Learning process, it is recommended to allocate a dedicated machine for this purpose within the cloud pipeline.&lt;/p&gt;

&lt;h1&gt;
  
  
  Integration with UML Design Tools:
&lt;/h1&gt;

&lt;p&gt;As previously mentioned, the proposed solution should seamlessly integrate with offline &lt;strong&gt;UML design&lt;/strong&gt; tools, including:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Microsoft Visio&lt;/li&gt;
&lt;li&gt;OmniGraffle&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Furthermore, the proposed solution should also integrate effectively with online &lt;strong&gt;UML design&lt;/strong&gt; tools, which encompass:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Enterprise Architecture&lt;/li&gt;
&lt;li&gt;LucidChart&lt;/li&gt;
&lt;li&gt;Draw.IO&lt;/li&gt;
&lt;li&gt;PlantUML&lt;/li&gt;
&lt;li&gt;Gliffy.com&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F94pnu49xy6y2m6d812w4.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F94pnu49xy6y2m6d812w4.png" alt="Image description" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Integration with Offline UML Design Tools
&lt;/h2&gt;

&lt;p&gt;Due to the absence of &lt;strong&gt;APIs&lt;/strong&gt; in offline tools, collaboration with them is established through import mechanisms.&lt;br&gt;
Consequently, architectural documents saved in &lt;strong&gt;Microsoft Visio&lt;/strong&gt; format will be exported by a plugin (integration point) and subsequently analyzed by the &lt;strong&gt;Processor&lt;/strong&gt;.&lt;br&gt;
The path for scanning input documents will be stored in the &lt;strong&gt;System Configuration DB&lt;/strong&gt;.&lt;br&gt;
To support this form of integration, the ability to parse various input formats must be implemented.&lt;/p&gt;

&lt;h2&gt;
  
  
  Integration with Online UML Design Tools
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Online UML&lt;/strong&gt; design tools typically offer &lt;strong&gt;APIs&lt;/strong&gt; for integration purposes.&lt;br&gt;
The collaboration with such tools will make use of their respective &lt;strong&gt;APIs&lt;/strong&gt;.&lt;br&gt;
However, it's important to note that some UML design tools might lack &lt;strong&gt;APIs&lt;/strong&gt; for integration.&lt;br&gt;
In such scenarios, the import of architecture documents to a designated folder will be undertaken.&lt;br&gt;
The subsequent parsing of these documents will be implemented to import data into the &lt;strong&gt;Processor&lt;/strong&gt;, following a similar approach as outlined earlier for offline tools.&lt;/p&gt;

&lt;p&gt;For online &lt;strong&gt;UML&lt;/strong&gt; design tools, &lt;strong&gt;HTTP&lt;/strong&gt; or &lt;strong&gt;REST APIs&lt;/strong&gt; are commonly available.&lt;br&gt;
Accordingly, the integration point will access data within the &lt;strong&gt;UML design&lt;/strong&gt; tool using the provided &lt;strong&gt;HTTP&lt;/strong&gt; or &lt;strong&gt;REST API&lt;/strong&gt;.&lt;br&gt;
Each integration with a specific tool will require a distinct integration point.&lt;br&gt;
For instance, integration with &lt;strong&gt;LucidChart&lt;/strong&gt; will be realized using the &lt;strong&gt;HTTP&lt;/strong&gt; protocol with &lt;strong&gt;GET&lt;/strong&gt; and &lt;strong&gt;POST&lt;/strong&gt; verbs.&lt;br&gt;
On the other hand, integration with &lt;strong&gt;Enterprise Architect&lt;/strong&gt; will involve the use of a &lt;strong&gt;REST API&lt;/strong&gt; with &lt;strong&gt;JSON&lt;/strong&gt; as the data format.&lt;/p&gt;

&lt;h1&gt;
  
  
  Integration with AWS, Azure, or GCP
&lt;/h1&gt;

&lt;p&gt;This section outlines how the proposed solution can seamlessly integrate with &lt;strong&gt;AWS&lt;/strong&gt;, &lt;strong&gt;Azure&lt;/strong&gt;, or &lt;strong&gt;GCP&lt;/strong&gt;.&lt;br&gt;
Given the potential enhancements &lt;strong&gt;Machine Learning&lt;/strong&gt; can offer in terms of result quality, it is advisable to allocate a dedicated compute node for &lt;strong&gt;ML&lt;/strong&gt; tasks. &lt;br&gt;
However, in scenarios where the on-premise environment lacks the capability to support &lt;strong&gt;ML&lt;/strong&gt; calculations, a viable solution is to leverage a &lt;strong&gt;Cloud Environment&lt;/strong&gt; for both &lt;strong&gt;ML&lt;/strong&gt; computation and the overall computing needs.&lt;/p&gt;

&lt;p&gt;Drawing from the deployment flows previously described, each component should be matched with the appropriate cloud provider service.&lt;br&gt;
For instance, in the context of &lt;strong&gt;AWS&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Processor - Leveraging AWS Lambda functions&lt;/li&gt;
&lt;li&gt;Database - Utilizing RDS and MySQL services&lt;/li&gt;
&lt;li&gt;Machine Learning - Employing AWS Machine Learning services&lt;/li&gt;
&lt;li&gt;And so forth for other components&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Similar mapping strategies can be applied for &lt;strong&gt;Azure&lt;/strong&gt; and &lt;strong&gt;GCP&lt;/strong&gt;, ensuring that each component seamlessly integrates with the suitable services provided by the respective cloud platforms.&lt;/p&gt;

&lt;h1&gt;
  
  
  Dependency Analysis Tool
&lt;/h1&gt;

&lt;p&gt;Dependency identification plays a crucial role in architecture analysis.&lt;br&gt;
It dissects the entire codebase into components and elucidates their interactions.&lt;br&gt;
Given that similar functions are already available in tools like &lt;strong&gt;JDeps&lt;/strong&gt;, leveraging their output would logically bolster the implementation of the &lt;strong&gt;proposed solution&lt;/strong&gt;.&lt;br&gt;
&lt;strong&gt;JDeps&lt;/strong&gt;, for instance, is a command-line tool utilized for launching the &lt;strong&gt;Java&lt;/strong&gt; class dependency analyzer.&lt;br&gt;
For systems built on the &lt;strong&gt;.NET framework&lt;/strong&gt;, &lt;strong&gt;Net Dependency Walker&lt;/strong&gt; serves as a suitable choice to ascertain dependencies.&lt;/p&gt;

&lt;h1&gt;
  
  
  Integration with Jenkins or Bamboo
&lt;/h1&gt;

&lt;p&gt;As mentioned previously, one facet of the application involves integration within a &lt;strong&gt;CI/CD&lt;/strong&gt; pipeline.&lt;br&gt;
&lt;strong&gt;CI/CD&lt;/strong&gt; represents a multifaceted and composite process, encompassing numerous stages.&lt;br&gt;
Within a single &lt;strong&gt;CI/CD&lt;/strong&gt; pipeline, a plethora of functionalities converge to facilitate a comprehensive workflow.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxdwmt3gx4odnp9pd4bs7.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxdwmt3gx4odnp9pd4bs7.png" alt="Image description" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The diagram provided illustrates a standard &lt;strong&gt;CI/CD&lt;/strong&gt; pipeline, depicted as the first pipeline.&lt;br&gt;
This pipeline encompasses multiple sequential stages, which include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Plan&lt;/li&gt;
&lt;li&gt;Code&lt;/li&gt;
&lt;li&gt;Build&lt;/li&gt;
&lt;li&gt;Test&lt;/li&gt;
&lt;li&gt;Release&lt;/li&gt;
&lt;li&gt;Deploy&lt;/li&gt;
&lt;li&gt;Operate&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;At present, two prominent products, &lt;strong&gt;Jenkins and Bamboo&lt;/strong&gt;, serve as implementations of the &lt;strong&gt;CI/CD&lt;/strong&gt; pipeline concept.&lt;br&gt;
In real-world project scenarios, both Jenkins and Bamboo are utilized to create pipelines tailored to specific project requirements.&lt;br&gt;
Typically, upon each code commit, at least one pipeline is triggered, orchestrating various processes.&lt;/p&gt;

&lt;p&gt;In the context of integrating the proposed solution, the existing pipeline structure can be extended.&lt;br&gt;
This extension entails invoking the proposed solution for architecture analysis.&lt;br&gt;
Consequently, the augmented pipeline would resemble the second pipeline depicted in the provided diagram.&lt;/p&gt;

</description>
      <category>tutorial</category>
      <category>architecture</category>
      <category>programming</category>
    </item>
    <item>
      <title>Detecting Architectural Gaps with Automation - Existing Solutions</title>
      <dc:creator>Dima Nikulin</dc:creator>
      <pubDate>Fri, 05 Apr 2024 06:59:48 +0000</pubDate>
      <link>https://forem.com/dimanikulin/detecting-architectural-gaps-with-automation-existing-solutions-35jk</link>
      <guid>https://forem.com/dimanikulin/detecting-architectural-gaps-with-automation-existing-solutions-35jk</guid>
      <description>&lt;h1&gt;
  
  
  Introduction
&lt;/h1&gt;

&lt;p&gt;In the rapidly evolving landscape of software development, maintaining the integrity and coherence of application architectures is paramount. &lt;br&gt;
With the proliferation of complex systems and frequent updates, ensuring that software architectures remain resilient against drifts, erosions, and compliance lapses has become a daunting challenge. &lt;br&gt;
However, innovative solutions like Bionic.ai, Castsoftware, NDepend, and Axivion Suite are revolutionizing the way organizations approach architecture governance and code quality management.&lt;br&gt;
As organizations navigate the complexities of modern software development, these innovative solutions provide indispensable tools for ensuring architectural coherence, compliance adherence, and code quality excellence.&lt;br&gt;
Through their diverse feature sets and integrative approaches, they herald a new era of architecture governance and software development efficiency.&lt;/p&gt;

&lt;h1&gt;
  
  
  Bionic.ai
&lt;/h1&gt;

&lt;p&gt;&lt;a href="https://www.bionic.ai/"&gt;Bionic&lt;/a&gt; is a platform designed to analyze the &lt;strong&gt;architecture&lt;/strong&gt; of applications and their dependencies in real-time.&lt;br&gt;
Initially, it creates a &lt;strong&gt;baseline&lt;/strong&gt; of the architecture during the initial scan.&lt;br&gt;
Subsequently, whenever a &lt;strong&gt;change occurs&lt;/strong&gt;, the &lt;strong&gt;next scan&lt;/strong&gt; is triggered to detect any drift or erosion.&lt;br&gt;
The platform supports regular scans by seamlessly integrating &lt;strong&gt;Bionic.ai&lt;/strong&gt; into the &lt;strong&gt;CI/CD&lt;/strong&gt; pipeline.&lt;br&gt;
Upon detecting a change, Bionic.ai suggests the context and thoroughly analyzes the potential impact of the changes.&lt;br&gt;
As a result, it generates comprehensive software &lt;strong&gt;architecture&lt;/strong&gt; diagrams, encompassing deployment, logical, and flow views.&lt;/p&gt;

&lt;h2&gt;
  
  
  Main features
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Facilitates checking if architecture rules and standards are applied&lt;/li&gt;
&lt;li&gt;Aids in identifying any structural or behavioral changes&lt;/li&gt;
&lt;li&gt;Conducts code and document scans during the initial or scheduled stages&lt;/li&gt;
&lt;li&gt;Determines new APIs in the application&lt;/li&gt;
&lt;li&gt;Capable of finding new data flows&lt;/li&gt;
&lt;li&gt;Detects new connections&lt;/li&gt;
&lt;li&gt;Provides a prioritized list of risks once changes occur&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzinlezo01sho4dqj1pbu.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzinlezo01sho4dqj1pbu.png" alt="Image description" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  Castsoftware Highlight
&lt;/h1&gt;

&lt;p&gt;&lt;a href="https://www.castsoftware.com/products/highlight"&gt;Cast Highlight&lt;/a&gt; is an application designed to automatically analyze the source code.&lt;/p&gt;

&lt;h2&gt;
  
  
  Main features:
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Analyzes the code to identify processes/applications suitable for refactoring, retirement, or rebuilding.&lt;/li&gt;
&lt;li&gt;Provides a readiness percentage for migrating to the cloud based on the analysis.&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;
  
  
  Castsoftware Cast Imaging
&lt;/h1&gt;

&lt;p&gt;&lt;a href="https://www.castsoftware.com/imaging"&gt;Cast Imaging&lt;/a&gt; is an application that creates visualizations of &lt;strong&gt;architecture&lt;/strong&gt;, offering several levels of detailed views ranging from services level up to code/classes level.&lt;br&gt;
It defines data flows from the high-level application perspective down to the database level.&lt;br&gt;
When changes occur, it provides the impact analysis, such as a list of components affected by the breaking of component communication.&lt;br&gt;
Additionally, it creates inventories of &lt;strong&gt;databases&lt;/strong&gt;, &lt;strong&gt;libraries/frameworks&lt;/strong&gt;, and &lt;strong&gt;languages&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Main features
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Performs reverse engineering of code, databases, and application dependencies.&lt;/li&gt;
&lt;li&gt;Generates holistic architecture views and blueprints.&lt;/li&gt;
&lt;li&gt;Interactive mode for exploring architecture views.&lt;/li&gt;
&lt;li&gt;Tagging feature to group components based on criteria, enabling easy component search and filtering after tagging is completed.&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;
  
  
  NDepend
&lt;/h1&gt;

&lt;p&gt;&lt;a href="https://www.workshell.co.uk/products/netdepends/"&gt;NDepend&lt;/a&gt; is an application designed to analyze &lt;strong&gt;C#&lt;/strong&gt; code, checking it against best practices and rules created by developers and architects. &lt;br&gt;
The tool enables users to manage dependencies through the creation of graphs and matrices.&lt;/p&gt;

&lt;h2&gt;
  
  
  Main features
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Utilize built-in rules and customize them according to specific needs.&lt;/li&gt;
&lt;li&gt;Investigate application structure and library linkages.&lt;/li&gt;
&lt;li&gt;Seamless integration into the CI/CD process, enabling real-time identification of code and architecture issues.&lt;/li&gt;
&lt;li&gt;Provides insights into the cost and priority of fixing identified issues.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fru6qmgwk3jkjbk7m013o.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fru6qmgwk3jkjbk7m013o.png" alt="Image description" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  Axivion Suite
&lt;/h1&gt;

&lt;p&gt;&lt;a href="https://www.axivion.com/en/"&gt;Axivion Suite&lt;/a&gt; is a powerful static code analysis tool that empowers users to thoroughly examine software &lt;strong&gt;architecture&lt;/strong&gt;, ensuring prevention of &lt;strong&gt;drifts&lt;/strong&gt; and &lt;strong&gt;erosions&lt;/strong&gt;. &lt;br&gt;
The platform offers customizable reporting with a reporting API, providing flexibility in generating reports.&lt;br&gt;
Axivion also includes an editor that allows users to create or customize rules for comprehensive code checking.&lt;/p&gt;

&lt;p&gt;Supported Compliance Standards/Rules:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;MISRA&lt;/li&gt;
&lt;li&gt;AUTOSAR C++14 code&lt;/li&gt;
&lt;li&gt;CERT&lt;/li&gt;
&lt;li&gt;CWE&lt;/li&gt;
&lt;li&gt;ISO/IEC TS 17961&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Supported Metrics:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;HIS (High Integrity Software)&lt;/li&gt;
&lt;li&gt;McCabe&lt;/li&gt;
&lt;li&gt;Tracking memory leaks&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;With Axivion Suite, users can proactively maintain the integrity and quality of their &lt;strong&gt;software architecture&lt;/strong&gt; by adhering to industry-leading compliance standards and monitoring key metrics.&lt;/p&gt;

&lt;h2&gt;
  
  
  Main Features
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Code checks for clones, identifying duplicated code segments to ensure code efficiency.&lt;/li&gt;
&lt;li&gt;Detection of unreachable code and cycles, improving code reliability and performance.&lt;/li&gt;
&lt;li&gt;Supported on three major operating systems - MacOS, Windows, and Linux, for seamless usage across platforms.&lt;/li&gt;
&lt;li&gt;Identification of technical debt, allowing developers to address code areas that require improvement or refactoring.&lt;/li&gt;
&lt;li&gt;Integration with CI (Continuous Integration) tools such as Jenkins and Bamboo, enabling smooth integration into development pipelines.&lt;/li&gt;
&lt;li&gt;Support for popular build systems like make, CMake, Msbuild, and Gradle, facilitating easy setup and usage.&lt;/li&gt;
&lt;li&gt;Analysis of delta changes against the baseline, enabling continuous tracking of code modifications and their impact on the architecture.&lt;/li&gt;
&lt;li&gt;IDE (Integrated Development Environment) plugins support, allowing developers to seamlessly integrate Axivion Suite into their preferred development environment for streamlined code analysis and optimization&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;
  
  
  Comparison of existing solutions
&lt;/h1&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Function&lt;/th&gt;
&lt;th&gt;Bionic&lt;/th&gt;
&lt;th&gt;Cast Imaging and Highlight&lt;/th&gt;
&lt;th&gt;Axivion&lt;/th&gt;
&lt;th&gt;NDepend&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;The initial scan to create a baseline of the holistic application architecture diagram involves capturing the comprehensive overview of all services, data flows, dependencies, APIs, technology stack, and application layers&lt;/td&gt;
&lt;td&gt;+&lt;/td&gt;
&lt;td&gt;+&lt;/td&gt;
&lt;td&gt;+&lt;/td&gt;
&lt;td&gt;+&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Creating inventories of all the languages, frameworks, libraries, and databases used in the application&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;+&lt;/td&gt;
&lt;td&gt;+&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;The scan after a change to detect drift or erosion (integration into CI/CD pipelines)&lt;/td&gt;
&lt;td&gt;+&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;+&lt;/td&gt;
&lt;td&gt;+&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Tagging the components&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;+&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Reporting the changes (behavioral or structural change)&lt;/td&gt;
&lt;td&gt;+&lt;/td&gt;
&lt;td&gt;+&lt;/td&gt;
&lt;td&gt;+&lt;/td&gt;
&lt;td&gt;+&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Detection Security level issues&lt;/td&gt;
&lt;td&gt;+&lt;/td&gt;
&lt;td&gt;+&lt;/td&gt;
&lt;td&gt;+&lt;/td&gt;
&lt;td&gt;+&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Detection Architecture level issues(new data flow, new API, new connection)&lt;/td&gt;
&lt;td&gt;+&lt;/td&gt;
&lt;td&gt;+&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;+&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Detection Compliance level issues&lt;/td&gt;
&lt;td&gt;+&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;+&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Detection DevOps level issues&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Detection Data level issues&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Scanning code and configuration&lt;/td&gt;
&lt;td&gt;+&lt;/td&gt;
&lt;td&gt;+&lt;/td&gt;
&lt;td&gt;+&lt;/td&gt;
&lt;td&gt;+&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Scanning documentation (UML) to get input&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;+&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Scanning DB&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;+&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;+&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Saving the results to UML documentation tools&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Impact analysis&lt;/td&gt;
&lt;td&gt;+&lt;/td&gt;
&lt;td&gt;+&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;+&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Simple to set up&lt;/td&gt;
&lt;td&gt;+&lt;/td&gt;
&lt;td&gt;+&lt;/td&gt;
&lt;td&gt;+&lt;/td&gt;
&lt;td&gt;+&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Check for cloud Readiness&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;+&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;As we can see from the table above, the existing &lt;strong&gt;solutions&lt;/strong&gt; do not provide coverage for levels important for &lt;strong&gt;architecture&lt;/strong&gt; governance, such as &lt;strong&gt;DevOps&lt;/strong&gt;, &lt;strong&gt;Data&lt;/strong&gt;, and &lt;strong&gt;Compliance&lt;/strong&gt;. &lt;br&gt;
Additionally, not all inputs are supported by the overviewed solutions.&lt;br&gt;
For example, scanning DB is not supported by &lt;strong&gt;Bionic.ai&lt;/strong&gt;, and scanning &lt;strong&gt;UML&lt;/strong&gt; documentation is not supported at all.&lt;/p&gt;

</description>
      <category>architecture</category>
      <category>tutorial</category>
      <category>softwaredevelopment</category>
    </item>
    <item>
      <title>Detecting Architectural Gaps with Automation - Business Context</title>
      <dc:creator>Dima Nikulin</dc:creator>
      <pubDate>Tue, 05 Mar 2024 06:50:53 +0000</pubDate>
      <link>https://forem.com/dimanikulin/detecting-architectural-gaps-with-automation-business-context-50ed</link>
      <guid>https://forem.com/dimanikulin/detecting-architectural-gaps-with-automation-business-context-50ed</guid>
      <description>&lt;h1&gt;
  
  
  Executive summary
&lt;/h1&gt;

&lt;p&gt;In today's rapidly changing software world, the ability to adapt and evolve the software architecture is &lt;strong&gt;crucial&lt;/strong&gt; for success.&lt;br&gt;
The readiness for change is a &lt;strong&gt;key&lt;/strong&gt; factor in ensuring a product can meet evolving business and product requirements in the high-tech industry.&lt;/p&gt;

&lt;p&gt;However, uncontrolled &lt;strong&gt;architecture drifts&lt;/strong&gt; and &lt;strong&gt;erosions&lt;/strong&gt; pose significant risks to a product's success.&lt;br&gt;
These drifts can result in the loss of expected extensibility and hinder the adoption of a product as the user base grows.&lt;br&gt;
Identifying and addressing these drifts is often done through complex and time-consuming manual architecture reviews, relying on experienced architects to assess the software architecture.&lt;/p&gt;

&lt;p&gt;Despite the importance of &lt;strong&gt;manual reviews&lt;/strong&gt;, they have limitations in terms of efficiency and coverage. &lt;br&gt;
Human factors can influence the identification of architectural issues, leading to inconsistencies and potentially missing critical problems.&lt;/p&gt;

&lt;p&gt;To overcome these challenges, there is a need for automated solutions that can detect &lt;strong&gt;architecture drift&lt;/strong&gt; and &lt;strong&gt;erosion&lt;/strong&gt; more effectively.&lt;br&gt;
By leveraging automated tools and processes, organizations can achieve better outcomes in terms of identifying and preventing architectural issues.&lt;/p&gt;

&lt;p&gt;This white paper explores the concept of &lt;strong&gt;detecting architectural gaps with automation&lt;/strong&gt;.&lt;br&gt;
It covers the impact of &lt;strong&gt;architecture drift&lt;/strong&gt; and &lt;strong&gt;erosion&lt;/strong&gt; on the business, the limitations of &lt;strong&gt;manual reviews&lt;/strong&gt;, and the benefits of automating architecture checks. &lt;br&gt;
Additionally, it discusses specific considerations related to &lt;strong&gt;compliance&lt;/strong&gt;, &lt;strong&gt;data security&lt;/strong&gt;, &lt;strong&gt;DevOps&lt;/strong&gt;, and more when evaluating architecture review solutions. &lt;br&gt;
The paper also provides use case scenarios to illustrate what automated architecture checks can look like in practice.&lt;/p&gt;

&lt;p&gt;By adopting &lt;strong&gt;automated architecture review&lt;/strong&gt; solutions, organizations can improve their ability to identify and address architectural gaps, ensuring the stability, scalability, and maintainability of their software systems.&lt;/p&gt;

&lt;h1&gt;
  
  
  Detecting Architectural Gaps with Automation
&lt;/h1&gt;

&lt;p&gt;Please read &lt;a href="https://www.globallogic.com/insights/white-papers/detecting-architectural-gaps-with-automation/"&gt;this paper&lt;/a&gt; before proceeding to the next chapters.&lt;/p&gt;

&lt;p&gt;You will gain insights into the following:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Understanding architecture drift and erosion&lt;/strong&gt;: Learn what architecture drift and erosion are and how they can impact the business. Gain an understanding of the risks and challenges associated with uncontrolled architectural changes.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Manual inspections and their limitations&lt;/strong&gt;: Explore the role of dependency analysis, peer reviews, and other manual inspections in detecting architectural issues. Understand why manual reviews, while important, may not be the ideal solution due to their limitations.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The need for automated architecture review&lt;/strong&gt;: Discover the benefits of automating architecture checks and how they can complement manual reviews. Learn how automation can provide more efficient and comprehensive detection of architectural gaps.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Considerations for evaluating architecture review solutions&lt;/strong&gt;: Explore specific considerations to keep in mind when evaluating architecture review solutions. Topics covered include compliance, data security, DevOps integration, and more.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Use case scenarios&lt;/strong&gt;: Gain insights into what automating architecture checks may look like through a series of example use case scenarios. Understand how automation can be applied in practical situations to enhance architecture review processes.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;By reading this paper, you will develop a deeper understanding of &lt;strong&gt;architecture drift and erosion&lt;/strong&gt;, the limitations of &lt;strong&gt;manual reviews&lt;/strong&gt;, the benefits of &lt;strong&gt;automation&lt;/strong&gt;, and important considerations when evaluating architecture review solutions.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fp18bdbukycn9hg73685p.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fp18bdbukycn9hg73685p.jpg" alt="Image description" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  Solution requirements
&lt;/h1&gt;

&lt;p&gt;This section outlines the requirements for implementing the solution.&lt;br&gt;
It is important to note that these requirements are not exhaustive and can be extended based on the specific needs of the project.&lt;br&gt;
The requirements are categorized into solution &lt;strong&gt;modes and inputs&lt;/strong&gt;, solution &lt;strong&gt;integration&lt;/strong&gt; and &lt;strong&gt;user interaction&lt;/strong&gt;, and &lt;strong&gt;solution output&lt;/strong&gt; with &lt;strong&gt;quality attributes&lt;/strong&gt; like modifiability, extendibility, and configurability.&lt;/p&gt;

&lt;h2&gt;
  
  
  Solution modes
&lt;/h2&gt;

&lt;p&gt;The proposed solution should support the following modes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Standalone application&lt;/strong&gt;: The solution should be designed to run as a standalone application, allowing it to be executed on demand without any dependencies on the target environment. This mode provides flexibility for manual execution of the solution.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Integration with CI/CD pipeline&lt;/strong&gt;: The solution should have the capability to integrate seamlessly into a CI/CD pipeline as a separate step. This mode enables regular assessment of the architecture within the automated pipeline.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In the context of the &lt;strong&gt;CI/CD&lt;/strong&gt; mode, the following features should be supported:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Initial architecture reference&lt;/strong&gt;: The solution should allow setting an initial architecture as a reference point. Any deviations from this reference architecture should be identified as architecture drifts.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Drift reporting and approval process&lt;/strong&gt;: When a drift is detected, the solution should provide an option to approve or decline the changes with comments. The description of the change should include an impact analysis, allowing the user to understand the cost associated with the proposed change.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Documenting drifts and erosion&lt;/strong&gt;: The solution should provide the ability to save the documentation that describes drifts or erosions. This documentation can be useful for future analysis and reference. It should be easily accessible for review and analysis purposes.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Integration with popular CI/CD tools&lt;/strong&gt;: The solution should be easily integrated with widely used CI/CD tools such as Jenkins, Bamboo, etc. This ensures compatibility and seamless integration into existing CI/CD workflows.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Solution inputs
&lt;/h2&gt;

&lt;p&gt;The proposed solution can accept various inputs, including:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Code from the solution under review&lt;/strong&gt;: The solution should be able to analyze and process code files from the software being reviewed.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Configuration from the solution under review&lt;/strong&gt;: Configuration files used by the software should be compatible with the solution to extract relevant information.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Software design from UML designing tools&lt;/strong&gt;: The solution should support importing software designs created using &lt;strong&gt;UML&lt;/strong&gt; (&lt;strong&gt;Unified Modeling Language&lt;/strong&gt;) tools. This allows for a comprehensive analysis of the software's architectural design.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Database scripts and database configuration&lt;/strong&gt;: The solution should be capable of working with database scripts and configurations, enabling analysis of the database layer in the software.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These inputs collectively provide the necessary information for the solution to perform its analysis and evaluation of the software architecture.&lt;/p&gt;

&lt;h2&gt;
  
  
  Solution integration
&lt;/h2&gt;

&lt;p&gt;Integration of the proposed solution with various tools and systems allows for a comprehensive analysis of software architecture.&lt;br&gt;
Here are the &lt;strong&gt;integration&lt;/strong&gt; possibilities mentioned:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Offline UML designing tools&lt;/strong&gt;: The solution can be integrated with offline UML designing tools like OmniGraffle and Microsoft Visio. This integration enables the import of UML diagrams created using these tools for analysis and evaluation.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Online UML designing tools&lt;/strong&gt;: Integration with online UML designing tools such as Enterprise Architect, LucidChart, Draw.IO, PlantUML, and Gliffy.com provides the ability to import UML diagrams created in these platforms. This expands the range of tools that can be used for software design and analysis.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Source control management systems&lt;/strong&gt;: Integration with source control management systems like SVN and Git allows the solution to access code and configuration files directly from the repository. This ensures that the latest version of the software is analyzed, and any changes made to the codebase are taken into account.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;By integrating the solution with these tools and systems, users can leverage existing software design and version control workflows to enhance the effectiveness of the automatic review process. &lt;/p&gt;

&lt;p&gt;As an example of the input code could be the code written in &lt;strong&gt;C#&lt;/strong&gt; using &lt;strong&gt;microservices architecture&lt;/strong&gt;. &lt;br&gt;
The other example could be the code written in &lt;strong&gt;JavaScript&lt;/strong&gt; for &lt;strong&gt;multi-tier applications&lt;/strong&gt;. &lt;/p&gt;

&lt;p&gt;The example of configuration might be the &lt;strong&gt;description of nodes&lt;/strong&gt; used in deployment.&lt;br&gt;
Another example could be the &lt;strong&gt;configuration of VPN networks&lt;/strong&gt; and &lt;strong&gt;API gateways&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;The example of input software design can be description of interfaces saved in &lt;strong&gt;Enterprise Architect&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  User interaction
&lt;/h2&gt;

&lt;p&gt;The proposed solution provides a web interface that allows users to &lt;strong&gt;interact&lt;/strong&gt; with it from a desktop computer.&lt;br&gt;
The interface is designed to accommodate the content and functionality required for software architecture analysis, making it unsuitable for mobile devices such as smartphones or tablets due to their smaller screen size.&lt;/p&gt;

&lt;p&gt;There are two types of users supported by the solution: &lt;strong&gt;administrators&lt;/strong&gt; and &lt;strong&gt;architects&lt;/strong&gt;. &lt;br&gt;
&lt;strong&gt;Administrators&lt;/strong&gt; have the capability to configure the system according to the intended use.&lt;br&gt;
They can set up various parameters and customize the solution to meet specific requirements.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Architects&lt;/strong&gt;, on the other hand, have the ability to run the proposed solution for analysis and review the results.&lt;br&gt;
They can initiate the analysis process and examine the generated analysis reports. &lt;br&gt;
The solution provides dashboards that display relevant metrics and software architecture status, such as the count of components and dependencies. &lt;br&gt;
These dashboards offer a comprehensive overview of the software architecture and assist architects in understanding its structure and characteristics.&lt;/p&gt;

&lt;p&gt;By catering to both &lt;strong&gt;administrators&lt;/strong&gt; and &lt;strong&gt;architects&lt;/strong&gt; and offering dedicated functionalities for each role, the solution ensures that users can effectively configure and utilize the system for software architecture analysis and evaluation.&lt;/p&gt;

&lt;h2&gt;
  
  
  Solution output
&lt;/h2&gt;

&lt;p&gt;The proposed solution offers two formats for presenting the output: &lt;strong&gt;text-based&lt;/strong&gt; (plain text or table) and &lt;strong&gt;graphic&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;The &lt;strong&gt;text-based format&lt;/strong&gt;, particularly in a table structure, provides users with detailed information about identified issues.&lt;/p&gt;

&lt;p&gt;The table typically includes the following columns:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Level of issue&lt;/strong&gt;: Indicates the severity or significance of the issue.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Issue priority&lt;/strong&gt;: Specifies the priority level assigned to address the issue.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Issue description&lt;/strong&gt;: Provides a clear description of the identified issue.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Suggested way to fix the issue&lt;/strong&gt;: Offers recommendations or guidelines on how to resolve the issue effectively.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Additionally, the table format includes separate sections that list various dependencies, such as &lt;strong&gt;frameworks&lt;/strong&gt;, &lt;strong&gt;libraries&lt;/strong&gt;, &lt;strong&gt;APIs&lt;/strong&gt;, &lt;strong&gt;databases&lt;/strong&gt;, &lt;strong&gt;technology stack (languages)&lt;/strong&gt;, and &lt;strong&gt;application layers&lt;/strong&gt;. &lt;br&gt;
Each section provides a comprehensive inventory of the associated components used in the application.&lt;br&gt;
This allows users to gain insights into the technologies and resources utilized and understand their impact on the architecture.&lt;/p&gt;

&lt;p&gt;Furthermore, the solution enables users to request inventories of specific &lt;strong&gt;elements&lt;/strong&gt;, including &lt;strong&gt;languages&lt;/strong&gt;, &lt;strong&gt;frameworks&lt;/strong&gt;, &lt;strong&gt;libraries&lt;/strong&gt;, and &lt;strong&gt;databases&lt;/strong&gt;, at any time.&lt;br&gt;
This feature provides a convenient way to access comprehensive information about the software application's underlying components and dependencies.&lt;/p&gt;

&lt;p&gt;The &lt;strong&gt;graphic format&lt;/strong&gt; is utilized to visually represent the software architecture, including &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;the holistic application architecture, &lt;/li&gt;
&lt;li&gt;diagrams of all services, &lt;/li&gt;
&lt;li&gt;and data flows. &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Both &lt;strong&gt;offline&lt;/strong&gt; and &lt;strong&gt;online UML&lt;/strong&gt; diagramming tools are employed to save and document the extracted software architecture. &lt;br&gt;
This graphic format allows users to annotate and tag components and inventory items using user-defined keywords.&lt;/p&gt;

&lt;p&gt;Here's an example of a graphic output:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Faxi7k79vg4ec7m4hvvm5.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Faxi7k79vg4ec7m4hvvm5.png" alt="Image description" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In the &lt;strong&gt;graphic&lt;/strong&gt; representation above, &lt;strong&gt;four services&lt;/strong&gt; and &lt;strong&gt;one database&lt;/strong&gt; are identified within the software architecture.&lt;br&gt;
The diagram clearly illustrates the relationships between these components and the direction of communication between them.&lt;/p&gt;

&lt;h2&gt;
  
  
  Modifiability and extendibility
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Modifiability and extendibility&lt;/strong&gt; are essential attributes for the proposed solution. &lt;br&gt;
The solution should be designed in a way that allows for easy extension and the addition of new features, such as new checks or levels. &lt;br&gt;
The scope of the solution should not restrict its ability to adapt to different project needs and requirements.&lt;/p&gt;

&lt;p&gt;By default, the solution should include a set of checks to verify the target architecture. &lt;br&gt;
However, for projects that already have an established architecture governance process, users should have the flexibility to extend and customize the set of checks according to their specific needs.&lt;/p&gt;

&lt;p&gt;Given the existence of various Static Code tools like &lt;strong&gt;Coverity&lt;/strong&gt; and &lt;strong&gt;SonarQube&lt;/strong&gt; that handle low-level checks like indentation and formatting, it would be redundant to implement those checks in the proposed solution.&lt;br&gt;
Instead, the solution should focus on providing value through higher-level architectural checks and analysis.&lt;/p&gt;

&lt;h2&gt;
  
  
  Configurability
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Configurability&lt;/strong&gt; is a crucial aspect of the proposed solution, allowing users to tailor the system to their specific needs and environment. &lt;br&gt;
The following configuration items can be supported:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Solution Mode&lt;/strong&gt;: The solution should offer different modes of operation, and users can configure the preferred mode during the deployment stage. For example, it can be run as a standalone application or integrated into the CI/CD pipeline.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Path for Architecture Documents&lt;/strong&gt;: Users should be able to specify the path to read architecture documents from offline UML design tools like OmniGraffle or Microsoft Visio.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Online UML Design Tool API&lt;/strong&gt;: The solution can integrate with online UML design tools like Enterprise Architect, LucidChart, Draw.IO, PlantUML, or Gliffy.com. Users need to provide the API address to access and update architecture documents online.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Source Control Management System Configuration&lt;/strong&gt;: The proposed solution should be able to integrate with version control systems like SVN or Git. Users will configure the settings to access code and configuration from these repositories.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Database Addresses for Data Layer Observation&lt;/strong&gt;: Users should provide the addresses of databases to observe the data layer and perform analysis on database scripts and configurations.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;CI/CD Tool Integration&lt;/strong&gt;: The solution should seamlessly integrate with popular CI/CD tools like Jenkins or Bamboo. Configuration options should enable easy integration into the CI/CD pipeline for regular architecture assessment.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Report Plugins Configuration&lt;/strong&gt;: Users should be able to configure report plugins, including their format and storage settings. This allows customization of the generated reports based on individual preferences and requirements.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;By providing these configurability options, the proposed solution becomes versatile and adaptable, meeting the specific needs and workflows of different projects and organizations.&lt;/p&gt;

</description>
      <category>architecture</category>
      <category>tutorial</category>
      <category>tooling</category>
      <category>softwareengineering</category>
    </item>
    <item>
      <title>What I learned as a Delivery Manager while creating my product</title>
      <dc:creator>Dima Nikulin</dc:creator>
      <pubDate>Mon, 29 Jan 2024 08:03:22 +0000</pubDate>
      <link>https://forem.com/dimanikulin/what-i-learned-as-a-delivery-manager-while-creating-my-product-55o1</link>
      <guid>https://forem.com/dimanikulin/what-i-learned-as-a-delivery-manager-while-creating-my-product-55o1</guid>
      <description>&lt;p&gt;First, I began contemplating how to increase engagement with my open-source project. &lt;strong&gt;Why?&lt;/strong&gt; Because:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Developers play a pivotal role in adopting and integrating your product into their projects.&lt;/li&gt;
&lt;li&gt;Engaged developers, who have a positive experience with your product, can become influential advocates.&lt;/li&gt;
&lt;li&gt;They are more likely to explore the extensibility options and customization capabilities of your product.&lt;/li&gt;
&lt;li&gt;Furthermore, engaged developers can offer valuable feedback, suggestions, and bug reports.&lt;/li&gt;
&lt;li&gt;Ultimately, they might actively participate in your product's open-source community, contributing code, reporting issues, and collaborating on its development.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Their contributions can expedite the pace of innovation, foster a sense of ownership and community, and trigger a network effect that entices more developers to get involved.&lt;/p&gt;

&lt;p&gt;As a result, I decided to create an appealing &lt;strong&gt;README&lt;/strong&gt;.&lt;/p&gt;

&lt;h1&gt;
  
  
  Create a Good Readme
&lt;/h1&gt;

&lt;p&gt;&lt;a href="https://github.com/dimanikulin/fva#readme"&gt;It&lt;/a&gt; is the first thing that a visitor to your repository sees.&lt;br&gt;
A good &lt;strong&gt;README&lt;/strong&gt; serves as a comprehensive and accessible starting point for users and developers to engage with your project.&lt;/p&gt;

&lt;p&gt;It should be able to convey what your project is capable of doing, how to install and work with the project, how to contribute, and more.&lt;br&gt;
It also maintains structured information about the product and its implementation details.&lt;/p&gt;

&lt;p&gt;To avoid overloading the main &lt;strong&gt;README&lt;/strong&gt;, there are several child files created to provide additional details:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://github.com/dimanikulin/fva/blob/master/CodeDocumentation.md"&gt;CodeDocumentation.md&lt;/a&gt; - Describes how to document the code.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/dimanikulin/fva/blob/master/CodeStyle.md"&gt;CodeStyle.md&lt;/a&gt;                 - Describes the code style.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/dimanikulin/fva/blob/master/Constraints.md"&gt;Constraints.md&lt;/a&gt;             - Describes the solution constraints.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/dimanikulin/fva/blob/master/Dependencies.md"&gt;Dependencies.md&lt;/a&gt;           - Describes the tools and libraries used for product development.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/dimanikulin/fva/blob/master/DependenciesOld.md"&gt;DependenciesOld.md&lt;/a&gt;     - Describes the old tools and libraries that were used for product development.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/dimanikulin/fva/blob/master/FunctionalView.md"&gt;FunctionalView.md&lt;/a&gt;       - Shows and describes the functional view.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/dimanikulin/fva/blob/master/QualityAttributes.md"&gt;QualityAttributes.md&lt;/a&gt; - Describes the product's Quality Attributes.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Furthermore, my **README starts with the product logo.&lt;/p&gt;

&lt;h2&gt;
  
  
  Badges
&lt;/h2&gt;

&lt;p&gt;The &lt;strong&gt;README&lt;/strong&gt; then proceeds to badge chapters that prove helpful for developers. These sections include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Common(Repository stars, contributors, followers, sponsors, and Twitter URL)&lt;/li&gt;
&lt;li&gt;Release(Latest release version, release date, and number of downloads)&lt;/li&gt;
&lt;li&gt;Code Statistics(Build flow status, GitHub commit activity, GitHub's latest commit, and CodeFactor.io status)&lt;/li&gt;
&lt;li&gt;Issues and Pull Requests(GitHub issues, closed issues, pull requests, and closed pull requests)&lt;/li&gt;
&lt;li&gt;Repository Statistics(GitHub top language, count of languages, and repository size)&lt;/li&gt;
&lt;li&gt;Documentation(Roadmap, Discussions, License, and Main README)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;There are three different types of badges based on their implementation approach:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Implemented by GitHub, displayed as: &lt;a href="https://github.com/dimanikulin/fva/actions/workflows/main.yml/badge.svg?branch=master"&gt;GitHub Badge&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Implemented by img.shields.io, displayed as: &lt;a href="https://img.shields.io/github/last-commit/dimanikulin/fva"&gt;Badge&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Implemented by &lt;a href="http://www.codefactor.io"&gt;www.codefactor.io&lt;/a&gt;, displayed as: &lt;a href="https://www.codefactor.io/repository/github/dimanikulin/fva"&gt;Badge&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7phf8imwnig7y49iltwk.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7phf8imwnig7y49iltwk.png" alt="Image description" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Quick Links
&lt;/h2&gt;

&lt;p&gt;Following this, the &lt;strong&gt;README&lt;/strong&gt; transitions to the &lt;a href="https://github.com/dimanikulin/fva#quick-links"&gt;Quick Links&lt;/a&gt; chapter.&lt;br&gt;
&lt;strong&gt;Quick links&lt;/strong&gt; within a &lt;strong&gt;README&lt;/strong&gt; file play a crucial role as they offer convenient access to key sections, resources, or external references relevant to a project.&lt;br&gt;
They act as navigation aids, enabling readers to swiftly navigate to specific parts of the &lt;strong&gt;README&lt;/strong&gt; without the need for extensive scrolling or searching.&lt;br&gt;
To enhance accessibility, I've added Quick Links for each main chapter in the &lt;a href="https://github.com/dimanikulin/fva#readme"&gt;README&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Capabilities and Description
&lt;/h2&gt;

&lt;p&gt;The description of &lt;a href="https://github.com/dimanikulin/fva#capabilities"&gt;capabilities&lt;/a&gt; and the &lt;a href="https://github.com/dimanikulin/fva#description"&gt;product's overview&lt;/a&gt; within a README file holds utmost importance.&lt;br&gt;
It plays a critical role in effectively conveying the value, purpose, and unique selling points of your product.&lt;br&gt;
This description aids users in comprehending what your product brings to the table, why it holds value, and whether it aligns with their requirements.&lt;br&gt;
By presenting information that is both clear and compelling, you can draw in the right audience and increase the likelihood of user adoption and satisfaction.&lt;/p&gt;

&lt;h2&gt;
  
  
  Architecture Documentation
&lt;/h2&gt;

&lt;p&gt;Subsequently, the &lt;strong&gt;README&lt;/strong&gt; delves into the description of &lt;strong&gt;Architecture Documentation&lt;/strong&gt;, encompassing the following chapters:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/dimanikulin/fva#software-architecture-requirements"&gt;Software Architecture Requirements&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/dimanikulin/fva#software-architecture-views"&gt;Software Architecture Views&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/dimanikulin/fva#dependencies"&gt;Tools&lt;/a&gt;, Libraries and &lt;a href="https://github.com/dimanikulin/fva#programming-languages"&gt;Programming Languages&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/dimanikulin/fva#license"&gt;Licenses&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For more detailed information, please refer to the designated &lt;a href="//./WhatILearnedAsAppArchitect.md"&gt;section&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Code Style and Documentation
&lt;/h2&gt;

&lt;p&gt;The &lt;strong&gt;README&lt;/strong&gt; then proceeds to expound upon &lt;a href="https://github.com/dimanikulin/fva#code-style"&gt;Code Style&lt;/a&gt; and &lt;a href="https://github.com/dimanikulin/fva#code-documentation"&gt;Documentation&lt;/a&gt;.&lt;br&gt;
The act of documenting code style and practices serves as a linchpin for maintaining consistency, upholding code quality, fostering collaboration, and ensuring the project's long-term maintainability. &lt;br&gt;
It acts as a valuable resource for the development team, guaranteeing that the project's codebase retains organization, comprehensibility, and scalability.&lt;/p&gt;

&lt;p&gt;Should you require further information, feel free to explore the section dedicated to &lt;strong&gt;Code Style&lt;/strong&gt; and &lt;strong&gt;Documentation&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Implementation Status
&lt;/h2&gt;

&lt;p&gt;Subsequently, I contemplated an effective means to monitor the &lt;a href="https://github.com/dimanikulin/fva#implementation-status"&gt;coverage&lt;/a&gt; of requirements.&lt;br&gt;
It was essential to establish a method for tracing and discerning which requirements had been covered and which ones remained unaddressed. &lt;br&gt;
To tackle this, I formulated a table equipped with the following columns:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Implemented&lt;/strong&gt;: This column denotes whether the requirement has been implemented, denoted as either "yes" or "no."&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Feature ID&lt;/strong&gt;: This serves as an identifier originating from the project's features.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Component&lt;/strong&gt;: This field specifies the name of the corresponding component.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;File Names&lt;/strong&gt;: Here, the file names are enumerated where the implementation pertaining to the requirement can be located.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Description&lt;/strong&gt;: This column furnishes a descriptive account of the functional requirement.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Contributing and Stay in Touch
&lt;/h2&gt;

&lt;p&gt;In this section, I outline the various channels that individuals can utilize to contribute to the project's development.&lt;br&gt;
This includes information on how one can actively participate and offer their assistance.&lt;/p&gt;

&lt;h2&gt;
  
  
  Definitions, Acronyms, Abbreviations
&lt;/h2&gt;

&lt;p&gt;Lastly, I provide an explanation of &lt;strong&gt;Definitions, Acronyms, and Abbreviations&lt;/strong&gt;.&lt;br&gt;
Presented in a tabular format, this section comprises the following columns:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Number&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Abbreviation or Acronym&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Definition&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;
  
  
  Project Status Tracking
&lt;/h1&gt;

&lt;p&gt;In a broader perspective, monitoring the project's status holds immense significance for a &lt;strong&gt;Delivery Manager&lt;/strong&gt;. &lt;br&gt;
This practice ensures the triumph of the project by overseeing factors such as risk management, resource allocation, effective communication, and the ability to make well-informed decisions across the entirety of the project's lifecycle.&lt;/p&gt;

&lt;h2&gt;
  
  
  GitHub Projects
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;GitHub Projects&lt;/strong&gt; emerges as a tool dedicated to tracking project status in an online environment, seamlessly integrated into your &lt;strong&gt;GitHub&lt;/strong&gt; profile. &lt;br&gt;
Its user-friendly interface facilitates ease of use, and while it doesn't offer an extensive array of functions, it adeptly serves its purpose. &lt;br&gt;
Allow me to present &lt;a href="https://github.com/dimanikulin/fva/projects/3"&gt;it&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  ProjectLibre
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxs9xql3hhw1a9tw8wc01.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxs9xql3hhw1a9tw8wc01.png" alt="Image description" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Despite the aforementioned options, the demand for a more sophisticated solution persisted.&lt;br&gt;
In light of this, my preference leaned towards &lt;a href="https://www.projectlibre.com/product/1-alternative-microsoft-project-open-source"&gt;ProjectLibre&lt;/a&gt;.&lt;br&gt;
The ProjectLibre software, designed for desktop usage, presents itself as a comprehensive and open-source project management system.&lt;br&gt;
Positioned as a stand-alone substitute for &lt;strong&gt;Microsoft Project&lt;/strong&gt;, &lt;strong&gt;ProjectLibre&lt;/strong&gt; effectively addresses the intricate requirements I sought.&lt;/p&gt;

&lt;p&gt;Despite its stature as a compact and cost-free application, &lt;strong&gt;ProjectLibre&lt;/strong&gt; remarkably delivered everything essential for my needs.&lt;/p&gt;

&lt;h1&gt;
  
  
  Releasing the Code and Documentation
&lt;/h1&gt;

&lt;p&gt;The release of the product is strategically planned to coincide with the readiness of a substantial portion of its functionality.&lt;br&gt;
Whenever a segment of the product's functionality is deemed ready for release, the creation or updating of the release branch ensues.&lt;br&gt;
This practice ensures that any added or updated product functionality is seamlessly integrated into the release branch.&lt;/p&gt;

&lt;p&gt;Irrespective of adopting an incremental approach to the addition or update of product functions, it's pivotal to underscore that the resulting artifacts shall encompass the entirety of the product installation packages.&lt;br&gt;
This holds true even when releasing relatively minor components of functionality.&lt;/p&gt;

&lt;p&gt;In adherence to this approach, the ensuing artifacts are generated:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Documentation for the code, structured around doxy comments.&lt;/li&gt;
&lt;li&gt;Installation packages for the latest versions of &lt;strong&gt;Windows, Mac, and Linux&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>markdown</category>
      <category>documentation</category>
      <category>opensource</category>
      <category>github</category>
    </item>
    <item>
      <title>What I learned as a Software Developer while creating my product</title>
      <dc:creator>Dima Nikulin</dc:creator>
      <pubDate>Tue, 28 Nov 2023 07:39:58 +0000</pubDate>
      <link>https://forem.com/dimanikulin/what-i-learned-as-a-software-developer-while-creating-my-product-5a99</link>
      <guid>https://forem.com/dimanikulin/what-i-learned-as-a-software-developer-while-creating-my-product-5a99</guid>
      <description>&lt;h1&gt;
  
  
  Code quality
&lt;/h1&gt;

&lt;p&gt;Before creating the code, it is crucial to prioritize its &lt;strong&gt;quality&lt;/strong&gt;.&lt;br&gt;
It should be the foremost consideration in the development process.&lt;br&gt;
To ensure &lt;strong&gt;code quality&lt;/strong&gt;, we can utilize automated tools that help with code analysis.&lt;br&gt;
However, it's important to note that automated tools may not cover all the necessary rules.&lt;br&gt;
As a result, manual code review becomes essential to enforce coding standards.&lt;br&gt;
Personally, I have dedicated significant time to code reviewing and checking for adherence to &lt;a href="https://github.com/dimanikulin/fva/blob/master/CodeStyle.md" rel="noopener noreferrer"&gt;code style&lt;/a&gt;.&lt;br&gt;
Additionally, I have employed &lt;strong&gt;Python&lt;/strong&gt; to create additional code checks. &lt;br&gt;
It is worth mentioning that not all rules can be checked automatically, requiring manual effort in certain cases.&lt;/p&gt;

&lt;h1&gt;
  
  
  Code documentation
&lt;/h1&gt;

&lt;p&gt;"&lt;em&gt;Now, hold on!&lt;/em&gt;" you might ask,&lt;br&gt;
"&lt;em&gt;Are we jumping straight into coding?&lt;/em&gt;" &lt;br&gt;
My answer is a resounding "&lt;em&gt;Nope&lt;/em&gt;".&lt;/p&gt;

&lt;p&gt;Before embarking on the coding phase, it is vital to consider &lt;strong&gt;code documentation&lt;/strong&gt;. &lt;br&gt;
Since the &lt;strong&gt;FVA Software&lt;/strong&gt; employs two programming languages, it is imperative to establish clear documentation rules for both &lt;a href="https://github.com/dimanikulin/fva/blob/master/CodeDocumentation.md" rel="noopener noreferrer"&gt;C++&lt;/a&gt; and &lt;strong&gt;Python&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Consequently, I have familiarized myself with documenting &lt;strong&gt;C++&lt;/strong&gt; code using &lt;strong&gt;Doxygen&lt;/strong&gt; markdown and have gained proficiency in generating documentation based on Doxygen markdown. &lt;br&gt;
It's quite remarkable how confident I am now in configuring &lt;strong&gt;Doxygen&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fntovcfnpcrikijoevlhk.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fntovcfnpcrikijoevlhk.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  Implementation
&lt;/h1&gt;

&lt;p&gt;Finally, we can proceed to the coding phase!&lt;br&gt;
For the development of &lt;strong&gt;FVA Software&lt;/strong&gt;, I have chosen the versatile &lt;a href="https://en.wikipedia.org/wiki/Qt_(software)" rel="noopener noreferrer"&gt;QT&lt;/a&gt; library, which supports multiple operating systems such as &lt;strong&gt;Windows&lt;/strong&gt;, &lt;strong&gt;macOS&lt;/strong&gt;, and &lt;strong&gt;Linux Ubuntu&lt;/strong&gt;. &lt;br&gt;
Since the software requires a user interface (&lt;a href="https://en.wikipedia.org/wiki/User_interface" rel="noopener noreferrer"&gt;UI&lt;/a&gt;), I initially utilized &lt;strong&gt;QWidgets&lt;/strong&gt;, including components like &lt;strong&gt;QWizard&lt;/strong&gt; and &lt;strong&gt;QWizardPage&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;However, I soon realized that employing &lt;strong&gt;QML&lt;/strong&gt; would offer a more streamlined approach for &lt;a href="https://en.wikipedia.org/wiki/User_interface" rel="noopener noreferrer"&gt;UI&lt;/a&gt; implementation.&lt;br&gt;
Therefore, my plan is to transition from &lt;strong&gt;QWidgets&lt;/strong&gt; to &lt;strong&gt;QML&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;I was pleasantly surprised by the ease of utilizing &lt;strong&gt;QT&lt;/strong&gt; for creating a multimedia content &lt;a href="https://github.com/dimanikulin/fva/blob/master/FVAPlayer" rel="noopener noreferrer"&gt;player&lt;/a&gt;. &lt;br&gt;
The flexibility of &lt;a href="https://en.wikipedia.org/wiki/Qt_(software)" rel="noopener noreferrer"&gt;QT&lt;/a&gt; allows me to work with multiple &lt;a href="https://en.wikipedia.org/wiki/User_interface" rel="noopener noreferrer"&gt;UI&lt;/a&gt; languages. &lt;br&gt;
To facilitate this, &lt;a href="https://en.wikipedia.org/wiki/Qt_(software)" rel="noopener noreferrer"&gt;QT&lt;/a&gt; suggests using the following components:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://doc.qt.io/qt-5/qtranslator.html" rel="noopener noreferrer"&gt;QTranslator&lt;/a&gt;;&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://doc.qt.io/qt-5/qtextcodec.html" rel="noopener noreferrer"&gt;QtextCodec&lt;/a&gt;;&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://doc.qt.io/qt-5/qlocale.html" rel="noopener noreferrer"&gt;Qlocale&lt;/a&gt;;&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://doc.qt.io/qt-5/qtextdecoder.html" rel="noopener noreferrer"&gt;QtextDecoder&lt;/a&gt;;&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://doc.qt.io/qt-5/qtextencoder.html" rel="noopener noreferrer"&gt;QtextEncoder&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Additionally, I discovered that working with &lt;strong&gt;SQLite&lt;/strong&gt; using &lt;a href="https://en.wikipedia.org/wiki/Qt_(software)" rel="noopener noreferrer"&gt;QT&lt;/a&gt; is remarkably straightforward. &lt;/p&gt;

&lt;p&gt;However, I later made the decision to switch from &lt;strong&gt;SQLite&lt;/strong&gt; to &lt;a href="https://github.com/dimanikulin/fva/blob/master/FVACommonLib/fvacsvfile.h" rel="noopener noreferrer"&gt;CSV&lt;/a&gt; for data storage.&lt;/p&gt;

&lt;p&gt;As my project involves working with two programming &lt;a href="https://github.com/dimanikulin/fva/blob/master/README.md#programming-languages" rel="noopener noreferrer"&gt;languages&lt;/a&gt;, I needed to establish a means of integrating &lt;strong&gt;Python&lt;/strong&gt; code into the &lt;strong&gt;C++&lt;/strong&gt; application.&lt;/p&gt;

&lt;p&gt;Last but not least, I acquired knowledge on how to create a &lt;a href="https://github.com/dimanikulin/fva/blob/master/FVACommonLib/fvariffparser.h" rel="noopener noreferrer"&gt;riff parser&lt;/a&gt;, adding another valuable capability to the project.&lt;/p&gt;

&lt;h1&gt;
  
  
  History of internal metadata formats
&lt;/h1&gt;

&lt;p&gt;The history of &lt;strong&gt;internal metadata&lt;/strong&gt; formats in FVA Software reveals the evolution of how the software stored and managed metadata.&lt;br&gt;
Initially, the metadata was kept at the file system level inside the Photo Album.&lt;br&gt;
Each folder in the Photo Album had two files: &lt;strong&gt;folderDescription.json&lt;/strong&gt; and &lt;strong&gt;description.csv&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;The &lt;strong&gt;folderDescription.json&lt;/strong&gt; file stored information that was common to all files within a folder, such as &lt;br&gt;
&lt;strong&gt;device ID&lt;/strong&gt;, &lt;strong&gt;tags&lt;/strong&gt;, &lt;strong&gt;people&lt;/strong&gt;, &lt;strong&gt;place&lt;/strong&gt;, and &lt;strong&gt;event&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8wha7ivdthv2hep0lzi5.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8wha7ivdthv2hep0lzi5.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;On the other hand, &lt;strong&gt;description.csv&lt;/strong&gt; was used to store information about files under a folder that had different &lt;strong&gt;internal metadata&lt;/strong&gt;.&lt;br&gt;
It had columns for &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Name&lt;/li&gt;
&lt;li&gt;Place&lt;/li&gt;
&lt;li&gt;People&lt;/li&gt;
&lt;li&gt;Device&lt;/li&gt;
&lt;li&gt;WhoTook&lt;/li&gt;
&lt;li&gt;Description&lt;/li&gt;
&lt;li&gt;Scaner&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;However, this approach of storing metadata at the file system level had limitations in terms of flexibility and maintainability. &lt;br&gt;
Adding or modifying a column in &lt;strong&gt;folderDescription.json&lt;/strong&gt; or &lt;strong&gt;description.csv&lt;/strong&gt; would require updating the entire photo album file system structure.&lt;/p&gt;

&lt;p&gt;To address these limitations, the decision was made to move the &lt;strong&gt;folderDescription.json&lt;/strong&gt; and &lt;strong&gt;description.csv&lt;/strong&gt; files to an &lt;strong&gt;SQLite&lt;/strong&gt; database. &lt;br&gt;
The database schema was designed to store the same information as before. &lt;br&gt;
During the import of new files to the photo album, the &lt;strong&gt;FVA software&lt;/strong&gt; created &lt;strong&gt;SQL&lt;/strong&gt; updates to the database. &lt;br&gt;
These &lt;strong&gt;SQL&lt;/strong&gt; updates were saved to be able to recreate the &lt;strong&gt;SQL&lt;/strong&gt; at any time.&lt;br&gt;
Although this approach improved flexibility and maintainability compared to the file system approach, merging folders in the photo album still caused significant changes in the &lt;strong&gt;SQL&lt;/strong&gt; updates.&lt;/p&gt;

&lt;p&gt;Finally, it was decided to consolidate all the information into a single &lt;strong&gt;CSV&lt;/strong&gt; file for &lt;strong&gt;internal metadata&lt;/strong&gt;. &lt;br&gt;
This &lt;strong&gt;CSV&lt;/strong&gt; file does not keep track of which folder a file is stored in, allowing for easier merging of folders without issues.&lt;br&gt;
However, it results in some duplication of information since common information for all files in a folder is simply copied.&lt;/p&gt;

&lt;p&gt;"&lt;em&gt;And what did you learn?&lt;/em&gt;" you might ask.&lt;br&gt;
The lesson learned is that before implementation, it is crucial to consider how easily you will maintain product changes. &lt;/p&gt;

&lt;p&gt;The history of internal metadata formats in FVA Software demonstrates the importance of designing a system architecture that is flexible and maintainable from the start.&lt;/p&gt;

</description>
      <category>softwaredevelopment</category>
      <category>codereview</category>
      <category>codequality</category>
      <category>documentation</category>
    </item>
    <item>
      <title>What I learned as an Application Architect while creating my product</title>
      <dc:creator>Dima Nikulin</dc:creator>
      <pubDate>Tue, 19 Sep 2023 05:26:07 +0000</pubDate>
      <link>https://forem.com/dimanikulin/what-i-learned-as-an-application-architect-while-creating-my-product-2j7p</link>
      <guid>https://forem.com/dimanikulin/what-i-learned-as-an-application-architect-while-creating-my-product-2j7p</guid>
      <description>&lt;ul&gt;
&lt;li&gt;"&lt;em&gt;Are you kidding?&lt;/em&gt;"  you might ask. "&lt;em&gt;Do such small applications require an architect to be involved?&lt;/em&gt;"&lt;/li&gt;
&lt;li&gt;"&lt;em&gt;Yes, yes, and yes!&lt;/em&gt;" I would answer.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Generally, architects create a huge document known as a &lt;strong&gt;Solution Architecture Document&lt;/strong&gt; that includes everything. &lt;br&gt;
Initially, I followed the same approach, but it turned out to be quite difficult to track changes due to the high frequency of modifications. &lt;br&gt;
So, I decided to keep every note and document in the form of text files in &lt;strong&gt;MD format&lt;/strong&gt;, like this one.&lt;br&gt;
I also learned how to create attractive &lt;strong&gt;README.md&lt;/strong&gt; files with the use of &lt;strong&gt;badges&lt;/strong&gt; from shields, providing document structure and required chapters.&lt;/p&gt;

&lt;h2&gt;
  
  
  Requirements
&lt;/h2&gt;

&lt;p&gt;I began my journey as an architect with &lt;strong&gt;requirements&lt;/strong&gt; selection. &lt;br&gt;
By selecting the right &lt;strong&gt;requirements&lt;/strong&gt;, an architect can ensure that the software is designed to meet specific &lt;strong&gt;business&lt;/strong&gt; goals and objectives, as well as technical and operational requirements. &lt;br&gt;
This helps ensure that the software is scalable, maintainable and meets the needs of both the &lt;strong&gt;end-users&lt;/strong&gt; and the &lt;strong&gt;stakeholders&lt;/strong&gt;.&lt;br&gt;
It's worth noting that my approach to selecting &lt;strong&gt;requirements&lt;/strong&gt; differed from that of a &lt;a href="https://github.com/dimanikulin/dimanikulin/blob/main/WhatILearnedAsProductManager.md"&gt;product manager&lt;/a&gt; because I needed more technical requirements. &lt;br&gt;
I divided architect requirements into four parts:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Constraints&lt;/strong&gt;;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Assumptions&lt;/strong&gt;;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Quality Attributes&lt;/strong&gt;;&lt;/li&gt;
&lt;li&gt;and &lt;strong&gt;Hardware requirements&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--ZXTL5JFg--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/d2pvw88um2dtd7lsjdlf.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--ZXTL5JFg--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/d2pvw88um2dtd7lsjdlf.png" alt="Image description" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Constraints
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Constraints&lt;/strong&gt; are factors that limit the architect's ability to design and implement a software solution.&lt;br&gt;
These factors may include technical, business, or organizational constraints that impact the development process.&lt;/p&gt;

&lt;p&gt;I have listed them on the following &lt;a href="https://github.com/dimanikulin/fva#constraints"&gt;page&lt;/a&gt; in the form of a table with the following columns:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Constraint&lt;/strong&gt; - to describe the constraint itself;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Description&lt;/strong&gt; - to provide more details about the constraint;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Business value&lt;/strong&gt; - to indicate the business value of the constraint (High, Medium, or Low);&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Architecture viewpoint&lt;/strong&gt; - to indicate the resources required to implement the constraint (High, Medium, or Low).&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Assumptions
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Assumptions&lt;/strong&gt; are &lt;a href="https://github.com/dimanikulin/fva#assumptions"&gt;statements&lt;/a&gt; made by the architect about the environment, conditions, or factors that are expected to be true for the software solution to function as intended. &lt;br&gt;
These statements are made based on available information, but they &lt;strong&gt;are not&lt;/strong&gt; necessarily proven to be true.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Assumptions&lt;/strong&gt; are important to consider during requirements selection because they can impact the design and implementation of the software solution. &lt;br&gt;
By identifying assumptions early in the development process, the architect can take steps to verify the assumptions and adjust the design as needed to ensure that the solution will function as intended.&lt;/p&gt;

&lt;h3&gt;
  
  
  Quality Attributes
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://github.com/dimanikulin/dimanikulin/blob/main/QualityAttributes.md"&gt;Quality Attributes&lt;/a&gt;, also known as non-functional requirements, are the characteristics of a software solution that describe how well it performs in terms of its operation, maintenance, and evolution. &lt;br&gt;
&lt;strong&gt;Quality attributes&lt;/strong&gt; are not directly related to the functionality of the software, but rather to how well it meets certain standards or requirements.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Quality attributes&lt;/strong&gt; are important to consider during requirements selection because they can impact the user experience, the cost of ownership, and the long-term success of the software solution.&lt;/p&gt;

&lt;p&gt;The &lt;strong&gt;quality attributes&lt;/strong&gt; are provided in the form of a &lt;a href="https://github.com/dimanikulin/fva#quality-attributes"&gt;table&lt;/a&gt; with the following columns:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Name&lt;/strong&gt;: to describe the quality attribute&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Description&lt;/strong&gt;: to provide additional details about the quality attribute&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Motivation&lt;/strong&gt;: to explain the rationale for selecting the quality attribute&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Measurable Metrics&lt;/strong&gt;: to indicate the metrics used to measure whether the quality attribute has been achieved or not&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Business Priorities&lt;/strong&gt;: to indicate the business priorities for the quality attribute&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Architecture Priorities&lt;/strong&gt;: to indicate the architecture priorities for the quality attribute&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Hardware requirements
&lt;/h3&gt;

&lt;p&gt;Last but not least were &lt;a href="https://github.com/dimanikulin/fva#hardware-requirements"&gt;hardware requirements&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Hardware requirements&lt;/strong&gt; refer to the physical components, such as servers, storage devices, and networking equipment, that are necessary to support the software solution. &lt;br&gt;
These requirements are based on the needs of the software and the expected workload or usage patterns.&lt;/p&gt;

&lt;p&gt;It is important to consider hardware requirements during the architecture design phase to ensure that the solution is designed to work within the limitations and capabilities of the hardware that will be used to support it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Software Architecture Views
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Software architecture views&lt;/strong&gt; are representations of different aspects of the software system that are designed to communicate specific information to different stakeholders. &lt;br&gt;
They provide a structured way to organize and present information about the architecture of the software system.&lt;br&gt;
By using &lt;strong&gt;software architecture views&lt;/strong&gt;, architects can ensure that all stakeholders have a clear understanding of the system and its architecture, which can help to avoid misunderstandings and ensure that the system is designed to meet the needs of all stakeholders.&lt;/p&gt;

&lt;p&gt;I created three &lt;strong&gt;Software architecture views&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Context view,&lt;/li&gt;
&lt;li&gt;Functional view,&lt;/li&gt;
&lt;li&gt;and Deployment view.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I used &lt;a href="https://mermaid-js.github.io/mermaid-live-editor/edit"&gt;Mermaid.js&lt;/a&gt; as it is supported now by GitHub.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--lv6rUawh--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/6lvo04jbiqclyyqpp9ax.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--lv6rUawh--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/6lvo04jbiqclyyqpp9ax.png" alt="Image description" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Context view
&lt;/h3&gt;

&lt;p&gt;A &lt;strong&gt;Context view&lt;/strong&gt; is a type of software architecture view that provides a high-level overview of the software system and its external environment. &lt;/p&gt;

&lt;p&gt;It shows the relationships between the software system and its users, other systems, and external entities.&lt;/p&gt;

&lt;p&gt;The &lt;a href="https://github.com/dimanikulin/fva#context-view"&gt;Context&lt;/a&gt; view is useful for stakeholders who need a high-level understanding of the software system and its contexts, such as business analysts, project managers, or system owners.&lt;/p&gt;

&lt;h3&gt;
  
  
  Functional view
&lt;/h3&gt;

&lt;p&gt;A &lt;strong&gt;Functional view&lt;/strong&gt; is a type of software architecture view that focuses on the functional or behavioral aspects of the software system.&lt;br&gt;
It describes the functional elements or components of the system and how they interact with each other to perform the desired tasks or functions.&lt;/p&gt;

&lt;p&gt;The &lt;a href="https://github.com/dimanikulin/fva#functional-view"&gt;Functional view&lt;/a&gt; is useful for software architects, developers, and testers who need to understand the functional requirements of the system and how they are implemented.&lt;/p&gt;

&lt;h3&gt;
  
  
  Deployment view
&lt;/h3&gt;

&lt;p&gt;A &lt;strong&gt;Deployment view&lt;/strong&gt; is a type of software architecture view that describes how the software system is deployed or installed in the computing environment. &lt;br&gt;
It shows the physical elements of the system, such as servers, networks, and storage devices, and how they are connected and configured to support the software system.&lt;/p&gt;

&lt;p&gt;The &lt;strong&gt;Deployment view&lt;/strong&gt; is useful for system administrators, operations teams, and infrastructure specialists who need to understand how the software system is deployed and managed in the computing environment.&lt;/p&gt;

&lt;p&gt;Since the FVA Tool Set can be deployed using only one node and a few processes, I provided a simple text &lt;a href="https://github.com/dimanikulin/fva#deployment-view"&gt;description&lt;/a&gt; for the &lt;strong&gt;Deployment view&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Tools, libraries and languages
&lt;/h2&gt;

&lt;p&gt;At some point, I realized that I needed a better way to manage the various IDEs, UI and command line tools, libraries, and languages that I use.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Mhmq2P95--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/8n81zsruufmfl6038q98.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Mhmq2P95--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/8n81zsruufmfl6038q98.png" alt="Image description" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Tools and libraries
&lt;/h3&gt;

&lt;p&gt;I compiled a list of all the tools and libraries that I used for development and presented them in a table on the project's GitHub &lt;a href="https://github.com/dimanikulin/fva#dependencies"&gt;page&lt;/a&gt;.&lt;br&gt;
The table includes the following columns: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Name&lt;/strong&gt; the name of the tool/library, &lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Purpose&lt;/strong&gt;: its intended purpose, &lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Version&lt;/strong&gt;: the version I used, &lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;License&lt;/strong&gt;: the license it is distributed under, &lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Environment&lt;/strong&gt;: the platform on which it can be run, &lt;/li&gt;
&lt;li&gt;and &lt;strong&gt;Comment&lt;/strong&gt;: any additional information I wanted to provide.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Initially, the list was much longer, but as some of the tools/libraries became outdated, I moved them to a separate table using the same format. &lt;br&gt;
You can find the old dependencies list &lt;a href="https://github.com/dimanikulin/fva/blob/master/DependenciesOld.md"&gt;here&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Languages
&lt;/h3&gt;

&lt;p&gt;I just used plain text to describe the &lt;a href="https://github.com/dimanikulin/fva#programming-languages"&gt;programming languages&lt;/a&gt; the FVA Software uses.&lt;/p&gt;

&lt;h2&gt;
  
  
  Licenses
&lt;/h2&gt;

&lt;p&gt;Undeniably, we should remember about licenses. &lt;br&gt;
As FVA Software uses third-party tools and libraries, their respective &lt;a href="https://github.com/dimanikulin/fva/blob/master/FVACommonLib/LICENSE"&gt;licenses&lt;/a&gt; should be included in the code. &lt;br&gt;
In addition, I had to create the FVA License and gained an understanding of what a license is and how to create one.&lt;/p&gt;

</description>
      <category>architecture</category>
      <category>development</category>
      <category>requirements</category>
    </item>
    <item>
      <title>What I learned as a Subject Matter Expert while creating my product</title>
      <dc:creator>Dima Nikulin</dc:creator>
      <pubDate>Mon, 01 May 2023 15:28:03 +0000</pubDate>
      <link>https://forem.com/dimanikulin/what-i-learned-as-a-subject-matter-expert-while-creating-my-product-a42</link>
      <guid>https://forem.com/dimanikulin/what-i-learned-as-a-subject-matter-expert-while-creating-my-product-a42</guid>
      <description>&lt;h2&gt;
  
  
  Multimedia IR systems
&lt;/h2&gt;

&lt;p&gt;My first step in the role of an SME was getting to know what &lt;a href="https://github.com/dimanikulin/dimanikulin/blob/main/MultimediaData.md"&gt;Multimedia Data&lt;/a&gt; is.&lt;br&gt;
I started learning it as I understood that my whole photo album is &lt;a href="https://github.com/dimanikulin/dimanikulin/blob/main/MultimediaData.md"&gt;Multimedia Data&lt;/a&gt; itself.&lt;/p&gt;

&lt;p&gt;Then I realised that I need to use a solution to search for &lt;a href="https://github.com/dimanikulin/dimanikulin/blob/main/MultimediaData.md"&gt;Multimedia Data&lt;/a&gt; - &lt;a href="https://github.com/dimanikulin/dimanikulin/blob/main/MultimediaIRSystems.md"&gt;Multimedia IR systems&lt;/a&gt;. &lt;/p&gt;

&lt;p&gt;However, there are many &lt;a href="https://github.com/dimanikulin/dimanikulin/blob/main/MultimediaIRSystems.md"&gt;Multimedia IR systems&lt;/a&gt;, and it was a long way to select one of them to start searching more efficiently.&lt;br&gt;
Thus, several &lt;a href="https://github.com/dimanikulin/dimanikulin/blob/main/MultimediaIRSystems.md"&gt;Multimedia IR systems&lt;/a&gt;, that are present on the market and available for end users, were analyzed. &lt;/p&gt;

&lt;p&gt;I described the process of analysis and comparison for &lt;a href="https://github.com/dimanikulin/dimanikulin/blob/main/MultimediaIRSystems.md"&gt;Multimedia IR systems&lt;/a&gt; &lt;a href="https://github.com/dimanikulin/dimanikulin/blob/main/MultimediaIRSystemsAnalyze.md"&gt;here&lt;/a&gt;.&lt;br&gt;
Consequently, I was able to choose the most suitable system for me.&lt;/p&gt;

&lt;h2&gt;
  
  
  Metadata
&lt;/h2&gt;

&lt;p&gt;A short usage of these systems gave me an understanding that &lt;a href="https://github.com/dimanikulin/dimanikulin/blob/main/MultimediaIRSystems.md"&gt;Multimedia IR systems&lt;/a&gt; significantly rely on the &lt;a href="https://en.wikipedia.org/wiki/Metadata"&gt;metadata&lt;/a&gt; as a main information source that is used for a search following different criteria, like device, time, location, etc.&lt;/p&gt;

&lt;p&gt;Therefore, the presence and consistency of &lt;a href="https://en.wikipedia.org/wiki/Metadata"&gt;metadata&lt;/a&gt; are very important for &lt;a href="https://github.com/dimanikulin/dimanikulin/blob/main/MultimediaIRSystems.md"&gt;Multimedia IR systems&lt;/a&gt; to operate, as well as for other purposes, please see &lt;a href="https://siarchives.si.edu/blog/three-cheers-embedded-metadata"&gt;Three Cheers for Embedded Metadata&lt;/a&gt; for more details.&lt;/p&gt;

&lt;p&gt;Working experience with one of those systems shows that search results might be incomplete or even incorrect due to inconsistent or not-existing &lt;a href="https://en.wikipedia.org/wiki/Metadata"&gt;metadata&lt;/a&gt;.&lt;br&gt;
&lt;a href="https://en.wikipedia.org/wiki/Metadata"&gt;Metadata&lt;/a&gt; is usually kept inside each file as a header with a predefined format.&lt;br&gt;
There are plenty of &lt;a href="https://en.wikipedia.org/wiki/Metadata"&gt;metadata&lt;/a&gt; formats like &lt;a href="https://en.wikipedia.org/wiki/Exif"&gt;Exif&lt;/a&gt;, &lt;a href="https://en.wikipedia.org/wiki/International_Press_Telecommunications_Council"&gt;IPTC&lt;/a&gt; or &lt;a href="https://en.wikipedia.org/wiki/Extensible_Metadata_Platform"&gt;XMP&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;The reasons for incorrect and absent &lt;a href="https://en.wikipedia.org/wiki/Metadata"&gt;metadata&lt;/a&gt; are quite different - from not setting proper data on the device that takes photos to privacy issues. &lt;/p&gt;

&lt;p&gt;This &lt;a href="https://digitalarch.org/blog/2017/4/7/ykag6k2fvln7g1j02923n0c7zdrryg"&gt;resource&lt;/a&gt; describes &lt;a href="https://en.wikipedia.org/wiki/Metadata"&gt;metadata&lt;/a&gt; importance in more detail and there is information about other reasons for incorrect and absent &lt;a href="https://en.wikipedia.org/wiki/Metadata"&gt;metadata&lt;/a&gt;. &lt;/p&gt;

&lt;h2&gt;
  
  
  Examples of incorrect search results
&lt;/h2&gt;

&lt;p&gt;Let's consider two examples of incorrect search results. &lt;br&gt;
In the first case, we tried to search for photos with existing &lt;strong&gt;Geo&lt;/strong&gt; positions and to see them on a map. &lt;br&gt;
A search returned four photos taken near &lt;strong&gt;Ghana&lt;/strong&gt;, marked by a red circle.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--PPszmn-4--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/djxqyt46altt6bq9up5h.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--PPszmn-4--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/djxqyt46altt6bq9up5h.png" alt="Examples of incorrect search result 1" width="800" height="450"&gt;&lt;/a&gt;&lt;br&gt;
In fact, nobody took photos near &lt;strong&gt;Ghana&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;In the second case, we searched for photos taken in &lt;strong&gt;2011&lt;/strong&gt;. &lt;br&gt;
We got one video that was recognized as &lt;strong&gt;March 2020&lt;/strong&gt;, underlined in red.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--HOAC4HLO--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/msplj5r7uvomc40r7e34.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--HOAC4HLO--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/msplj5r7uvomc40r7e34.png" alt="Examples of incorrect search result 2" width="800" height="450"&gt;&lt;/a&gt;&lt;br&gt;
The system has provided such results due to incorrect &lt;a href="https://en.wikipedia.org/wiki/Metadata"&gt;metadata&lt;/a&gt;. &lt;/p&gt;

&lt;h2&gt;
  
  
  Multimedia Organizers
&lt;/h2&gt;

&lt;p&gt;That being the case, I understood that &lt;a href="https://github.com/dimanikulin/dimanikulin/blob/main/MultimediaIRSystems.md"&gt;Multimedia IR systems&lt;/a&gt; are not so effective without other tools, often called &lt;a href="https://github.com/dimanikulin/dimanikulin/blob/main/MultimediaOrganizers.md"&gt;Multimedia Organizers&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Usually, &lt;a href="https://github.com/dimanikulin/dimanikulin/blob/main/MultimediaOrganizers.md"&gt;Multimedia Organizers&lt;/a&gt; provide automation for importing a new photo set into existing photo albums and it is not an implemented feature in &lt;a href="https://github.com/dimanikulin/dimanikulin/blob/main/MultimediaIRSystems.md"&gt;Multimedia IR systems&lt;/a&gt;.&lt;br&gt;
In addition, they might identify and address some issues that shall be fixed before a user starts searching data using the &lt;a href="https://github.com/dimanikulin/dimanikulin/blob/main/MultimediaIRSystems.md"&gt;Multimedia IR systems&lt;/a&gt;. &lt;/p&gt;

&lt;h2&gt;
  
  
  Integration
&lt;/h2&gt;

&lt;p&gt;Then I started studying &lt;a href="https://github.com/dimanikulin/dimanikulin/blob/main/MultimediaIRSystems.md"&gt;Multimedia IR systems&lt;/a&gt; the &lt;strong&gt;FVA Tool Set&lt;/strong&gt; shall integrate with. &lt;br&gt;
Integration with offline &lt;a href="https://github.com/dimanikulin/dimanikulin/blob/main/MultimediaIRSystems.md"&gt;Multimedia IR systems&lt;/a&gt; is implemented through integration with &lt;a href="https://www.digikam.org/about/"&gt;digiKam&lt;/a&gt;, and integration with online &lt;a href="https://github.com/dimanikulin/dimanikulin/blob/main/MultimediaIRSystems.md"&gt;Multimedia IR systems&lt;/a&gt; is implemented through integration with &lt;a href="https://en.wikipedia.org/wiki/Google_Photos"&gt;Google Photos&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;As &lt;a href="https://github.com/dimanikulin/dimanikulin/blob/main/MultimediaIRSystems.md"&gt;Multimedia IR systems&lt;/a&gt; perform a search by certain criteria, based on multimedia &lt;a href="https://en.wikipedia.org/wiki/Metadata"&gt;metadata&lt;/a&gt;, the FVA Software shall be able to work with the same multimedia &lt;a href="https://en.wikipedia.org/wiki/Metadata"&gt;metadata&lt;/a&gt; to be integrated with &lt;a href="https://github.com/dimanikulin/dimanikulin/blob/main/MultimediaIRSystems.md"&gt;Multimedia IR systems&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s---t-oElDd--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/jvukvf1bdkrwwi6d4sox.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s---t-oElDd--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/jvukvf1bdkrwwi6d4sox.png" alt="Integration with FVA" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Integration with digiKam
&lt;/h3&gt;

&lt;p&gt;For &lt;a href="https://www.digikam.org/about/"&gt;digiKam&lt;/a&gt;, I found that the &lt;strong&gt;Collections&lt;/strong&gt; setting shall be used to define how it is configured to search through &lt;a href="https://link.springer.com/referenceworkentry/10.1007%2F978-0-387-39940-9_1008"&gt;multimedia data&lt;/a&gt;. &lt;br&gt;
&lt;strong&gt;Monitor the albums for external changes (requires restart)&lt;/strong&gt; setting shall be enabled. &lt;br&gt;
Taking into account this setting, &lt;a href="https://www.digikam.org/about/"&gt;digiKam&lt;/a&gt; will pick up external changes in the collection as soon as FVA Tool Set puts it in.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--uUMwqKLi--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/frkea263of9uugns67tz.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--uUMwqKLi--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/frkea263of9uugns67tz.png" alt="Integration with digiKam" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;However, from the &lt;strong&gt;FVA Tool Set&lt;/strong&gt; side, it is required to provide a possibility to configure storage in a way to be able to put &lt;a href="https://link.springer.com/referenceworkentry/10.1007%2F978-0-387-39940-9_1008"&gt;multimedia data&lt;/a&gt; processed and to be integrated with &lt;a href="https://www.digikam.org/about/"&gt;digiKam&lt;/a&gt;.&lt;br&gt;
Therefore, a separate &lt;a href="https://en.wikipedia.org/wiki/User_interface"&gt;UI&lt;/a&gt; screen shall be created to ask a user what storage location, &lt;a href="https://www.digikam.org/about/"&gt;digiKam&lt;/a&gt; should be used for incoming &lt;a href="https://link.springer.com/referenceworkentry/10.1007%2F978-0-387-39940-9_1008"&gt;multimedia data&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;For example, a directory &lt;strong&gt;C:\FVA&lt;/strong&gt; is selected for &lt;strong&gt;Local Collections&lt;/strong&gt; as shown in the picture above. &lt;br&gt;
Therefore, when a user wants to integrate &lt;a href="https://link.springer.com/referenceworkentry/10.1007%2F978-0-387-39940-9_1008"&gt;multimedia data&lt;/a&gt; after processing by FVA Tool Set, he/she shall be able to select the &lt;strong&gt;C:\FVA&lt;/strong&gt; directory as a directory in &lt;a href="https://en.wikipedia.org/wiki/User_interface"&gt;UI&lt;/a&gt; to put the processed &lt;a href="https://link.springer.com/referenceworkentry/10.1007%2F978-0-387-39940-9_1008"&gt;multimedia data&lt;/a&gt; in.&lt;/p&gt;

&lt;p&gt;As soon as it is done, &lt;strong&gt;FVA Tool Set&lt;/strong&gt; will put &lt;a href="https://link.springer.com/referenceworkentry/10.1007%2F978-0-387-39940-9_1008"&gt;multimedia data&lt;/a&gt; into a selected directory and the &lt;strong&gt;Multimedia IR system&lt;/strong&gt; will be able to search through it.&lt;/p&gt;

&lt;h3&gt;
  
  
  Integration with Google Photos
&lt;/h3&gt;

&lt;p&gt;Integration with &lt;a href="https://en.wikipedia.org/wiki/Google_Photos"&gt;Google Photos&lt;/a&gt; is implemented in the same way. &lt;br&gt;
First of all, it's worth noting that &lt;a href="https://en.wikipedia.org/wiki/Google_Photos"&gt;Google Photos&lt;/a&gt; shall be configured to be integrated with &lt;strong&gt;FVA Tool Set&lt;/strong&gt;. &lt;br&gt;
Thus, appropriate file types and folders shall be set up as in the figure below:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--ZIDzwhCP--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/9lkoau0kwdlsy4yahtkl.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--ZIDzwhCP--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/9lkoau0kwdlsy4yahtkl.png" alt="Integration with Google Photos" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;For example, &lt;strong&gt;Pictures&lt;/strong&gt; and &lt;strong&gt;fromDevices&lt;/strong&gt; directories are selected for the folder settings as shown above. &lt;br&gt;
It means that when a user wants to integrate &lt;a href="(https://link.springer.com/referenceworkentry/10.1007%2F978-0-387-39940-9_1008)"&gt;multimedia data&lt;/a&gt; after processing by &lt;strong&gt;FVA Tool Set&lt;/strong&gt;, he/she shall be able to select the &lt;strong&gt;fromDevices&lt;/strong&gt; or &lt;strong&gt;Pictures&lt;/strong&gt; directory on the &lt;a href="https://en.wikipedia.org/wiki/User_interface"&gt;UI&lt;/a&gt; screen, as a directory to put processed &lt;a href="https://link.springer.com/referenceworkentry/10.1007%2F978-0-387-39940-9_1008"&gt;multimedia data&lt;/a&gt; in. &lt;/p&gt;

&lt;p&gt;As soon as it is done, &lt;strong&gt;FVA Tool Set&lt;/strong&gt; will put &lt;a href="https://link.springer.com/referenceworkentry/10.1007%2F978-0-387-39940-9_1008"&gt;multimedia data&lt;/a&gt; into a selected directory and &lt;a href="https://en.wikipedia.org/wiki/Google_Photos"&gt;Google Photos&lt;/a&gt; will be able to search through it as soon as it synchronizes &lt;a href="https://link.springer.com/referenceworkentry/10.1007%2F978-0-387-39940-9_1008"&gt;multimedia data&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>tutorial</category>
      <category>ir</category>
      <category>photoorganizer</category>
      <category>metadata</category>
    </item>
    <item>
      <title>What I learned as a Product Manager while creating my product</title>
      <dc:creator>Dima Nikulin</dc:creator>
      <pubDate>Fri, 03 Mar 2023 11:16:37 +0000</pubDate>
      <link>https://forem.com/dimanikulin/what-i-learned-as-a-product-manager-while-creating-my-product-3fom</link>
      <guid>https://forem.com/dimanikulin/what-i-learned-as-a-product-manager-while-creating-my-product-3fom</guid>
      <description>&lt;h2&gt;
  
  
  Design Thinking
&lt;/h2&gt;

&lt;p&gt;The first product I was thinking about was "FVA Tool Set".&lt;br&gt;
Subsequently, another product came to my mind. As a result, a Product Line came about.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;"Hold on, you started from thinking of products, right?", - you will ask me.&lt;/li&gt;
&lt;li&gt;"Nope, I started from... It was ages ago and a whole &lt;a href="https://github.com/dimanikulin/dimanikulin/blob/master/WhyCreatedPhotoOrganizer.md"&gt;history&lt;/a&gt; is quite big. Being a developer, I started from coding".&lt;/li&gt;
&lt;li&gt;"Was it a good idea to start from coding?", - you will ask me. &lt;/li&gt;
&lt;li&gt;"Again no. I would have started from Design Thinking, if I was familiar with it." &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Design Thinking is a process of preparation, which consists of seven stages of creating a product:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Empathize-who, goal, do&lt;/strong&gt; Here you need to create an artifact called "Empathy Map" with a formula - who, goal, do;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Empathize-see, say, do, hear&lt;/strong&gt; Here you need to create an artifact called "Empathy Map" with a formula - see, say, do, hear;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Empathize-think and feel&lt;/strong&gt; Here you need to create an artifact called "Empathy Map" with a formula - think and feel;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Define: Problem Statement&lt;/strong&gt; Here you need to describe a problem basing on the "Empathy Map";&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Ideate&lt;/strong&gt; Here you need to nave a list of raw ideas to explore.&lt;/li&gt;
&lt;li&gt;There are also other stages not mentioned here.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  High-level product documentation
&lt;/h2&gt;

&lt;p&gt;Once I came up with product ideas to implement, I realized that a set of documentation artifacts to keep high-level product knowledge had to be established.&lt;/p&gt;

&lt;h3&gt;
  
  
  Value Propositions
&lt;/h3&gt;

&lt;p&gt;The first artifact to consider was Value Proposition.&lt;br&gt;
which has the following components:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Mapper&lt;/strong&gt; for Products and Services to Customer Jobs;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Mapper&lt;/strong&gt; for Gain creators to Gains;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Mapper&lt;/strong&gt; for Pain relievers to Pains;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;One Pager&lt;/strong&gt; with Value Proposition. &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--F7FPtGRR--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ee2r064rtlhmt7l2lu0u.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--F7FPtGRR--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ee2r064rtlhmt7l2lu0u.png" alt="Image description" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Business Model Canvas
&lt;/h3&gt;

&lt;p&gt;The next artifact was Business Model Canvas. &lt;br&gt;
I downloaded a template &lt;a href="//strategyzer.com"&gt;here&lt;/a&gt; and filled in the following fields:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Key Partners&lt;/strong&gt; to answer the questions: &lt;strong&gt;Who are the key partners? Who are the key suppliers?&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Key Activities&lt;/strong&gt; to answer the questions: &lt;strong&gt;What are the main tasks that the company must do well to deliver its value?&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Key Resources&lt;/strong&gt; to answer the questions: &lt;strong&gt;What are the most important physical, financial, intellectual or human recourses the company has?&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Value Propositions&lt;/strong&gt; to answer the questions: &lt;strong&gt;What value do we deliver to the customer? Which customer needs do we want to satisfy?&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Customer Relationships&lt;/strong&gt; to answer the questions: &lt;strong&gt;What type of relationship does each of the customer segments expect us to establish and maintain with them?&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Channels&lt;/strong&gt; to answer the questions: &lt;strong&gt;Which channels do our customer segments want to be reached through? How do we reach them now?&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Customer Segments&lt;/strong&gt; to answer the questions: &lt;strong&gt;Whom are we creating value for? Who are our most important customers?&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Revenue Streams&lt;/strong&gt; to answer the questions: &lt;strong&gt;What value are our customers willing to pay for? What do they currently pay for? How do they pay? How would they prefer to pay?&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cost Structure&lt;/strong&gt; to answer the questions: &lt;strong&gt;Where do the costs come from?&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Product Vision Board
&lt;/h3&gt;

&lt;p&gt;The third artifact was Product Vision Board.&lt;br&gt;
I downloaded a template &lt;a href="https://www.romanpichler.com/"&gt;here&lt;/a&gt; and filled in the following fields:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;VISION&lt;/strong&gt; to answer the questions: &lt;strong&gt;What is your purpose for creating the product? Which positive change should it bring about?&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;TARGET GROUP&lt;/strong&gt; to answer the questions: &lt;strong&gt;Which market or market segment does the product address? Who are target customers and users?&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;NEEDS&lt;/strong&gt; to answer the questions: &lt;strong&gt;What problem does the product solve? Which benefit does it provide?&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;PRODUCT&lt;/strong&gt; to answer the questions: &lt;strong&gt;What kind of product is it? What makes it stand out? Is it feasible to develop the product?&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;BUSINESS GOALS&lt;/strong&gt; to answer the questions: &lt;strong&gt;How is the product going to benefit the company? What are business goals?&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Competitive Analysis Matrix
&lt;/h3&gt;

&lt;p&gt;The last artifact in High-level product documentation was Competitive Analysis Matrix&lt;br&gt;
I filled in the following rows for several products:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Vision&lt;/strong&gt; with &lt;strong&gt;Goal and Target segment&lt;/strong&gt;;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Marketing&lt;/strong&gt; with &lt;strong&gt;Pricing and  Unique value proposition&lt;/strong&gt;;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;End user support&lt;/strong&gt; with &lt;strong&gt;Trainings, User guide and Help desk&lt;/strong&gt;;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Features&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Product from user prospective
&lt;/h2&gt;

&lt;p&gt;As soon as high-level product documentation was ready, I decided to go deeper with more detail from the user's point of view.&lt;/p&gt;

&lt;h3&gt;
  
  
  Persona
&lt;/h3&gt;

&lt;p&gt;The first artifact I created was Persona&lt;br&gt;
I downloaded a template &lt;a href="https://www.romanpichler.com/"&gt;here&lt;/a&gt; and filled in the following fields:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;PICTURE &amp;amp; NAME&lt;/strong&gt; to answer the questions: &lt;strong&gt;What does the persona look like? What is his/her name?&lt;/strong&gt; I chose a realistic and plausible picture and name.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;DETAILS&lt;/strong&gt; to answer the questions: &lt;strong&gt;What are persona’s relevant characteristics and behaviors?&lt;/strong&gt; I wrote in demographics, such as age, gender, occupation, and income; psychographics, including lifestyle, social class, and personality; and behavioral attributes like usage patterns, attitudes and brand loyalty.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;GOAL&lt;/strong&gt; to answer the questions: &lt;strong&gt;What problem does persona want to solve or which benefit does the character seek? Why would persona want to use or buy the product?&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--7oeVpTfU--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/v8bpu98k3tpnj7qm1blh.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--7oeVpTfU--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/v8bpu98k3tpnj7qm1blh.png" alt="Image description" width="800" height="449"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  User Journey and User Scenarios
&lt;/h3&gt;

&lt;p&gt;Then I tried to restore user way to achieve the goals. &lt;br&gt;
And I came up with User Journey.&lt;/p&gt;

&lt;p&gt;To show the value of the product, I created three user scenarios and posted them on YouTube. Please see the reference to watch them.&lt;/p&gt;

&lt;h3&gt;
  
  
  Stakeholders
&lt;/h3&gt;

&lt;p&gt;Honestly, a bit later I realized that end users are not the only target audience for this product.&lt;br&gt;
And next artifact - Stakeholders - came into sight.&lt;br&gt;
It looks like a table with the following columns: Group, Stakeholder Role, Concerns, View.&lt;br&gt;
Table rows contain as follows: End users, Suppliers and Team members.&lt;/p&gt;

&lt;h2&gt;
  
  
  Product requirements
&lt;/h2&gt;

&lt;p&gt;Having defined everything from the user's point of view, I started thinking what exactly the product will implement.&lt;/p&gt;

&lt;h3&gt;
  
  
  Questionnaire
&lt;/h3&gt;

&lt;p&gt;Having no clue what is important for the user and what is not, I created a &lt;a href="https://docs.google.com/forms/d/1EI3oOumRnHxDjEYgV6PFB-AMfV5plLtuV2r5S8BYn_g/"&gt;questionnaire to clarify user needs&lt;/a&gt;.&lt;br&gt;
It is a form to gather information on what capabilities, functions and scenarios are important. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--lnF7ydnO--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/05nqhq7ihfv33vvxn6y8.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--lnF7ydnO--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/05nqhq7ihfv33vvxn6y8.png" alt="Image description" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Capabilities
&lt;/h3&gt;

&lt;p&gt;Having gained an understanding of user needs, I started describing &lt;a href="https://github.com/dimanikulin/fva#capabilities"&gt;Capabilities&lt;/a&gt;&lt;br&gt;
Literally, Capabilities describe key requirements.&lt;/p&gt;

&lt;h3&gt;
  
  
  Features
&lt;/h3&gt;

&lt;p&gt;Having capability list defined, I started preparing features.&lt;br&gt;
They represent significant, central functionality of the final system. &lt;br&gt;
I put them into the table with the following columns: Name, Clarification, Business Value.&lt;br&gt;
The feature set helped me to create a project plan and a road map. &lt;/p&gt;

&lt;h3&gt;
  
  
  Functional Requirements
&lt;/h3&gt;

&lt;p&gt;Last but not least step in defining product behavior was a list of &lt;strong&gt;Functional Requirements&lt;/strong&gt;, that define system detail behavior.&lt;br&gt;
I settled them into the table with the following columns: &lt;strong&gt;Name&lt;/strong&gt;, &lt;strong&gt;Architecture complexity&lt;/strong&gt;, &lt;strong&gt;Business Value&lt;/strong&gt;, &lt;strong&gt;Component&lt;/strong&gt;, &lt;strong&gt;Phase&lt;/strong&gt;, &lt;strong&gt;Feature ID&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Product development documents
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Product Road Map
&lt;/h3&gt;

&lt;p&gt;I believe, &lt;strong&gt;Product Road Map&lt;/strong&gt; is the most important document for a product at the development stage. &lt;br&gt;
I downloaded a template &lt;a href="https://www.romanpichler.com/"&gt;here&lt;/a&gt; and filled in the following fields and rows:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;DATE&lt;/strong&gt; with &lt;strong&gt;Release date or timeframe&lt;/strong&gt;;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;NAME&lt;/strong&gt; with &lt;strong&gt;Name of new release&lt;/strong&gt;;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;GOAL&lt;/strong&gt; with &lt;strong&gt;The benefit a product should provide&lt;/strong&gt;;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;FEATURES&lt;/strong&gt; with &lt;strong&gt;High-level features necessary to meet the goal&lt;/strong&gt;;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;METRICS&lt;/strong&gt; with &lt;strong&gt;Metrics to determine if the goal has been met&lt;/strong&gt;.
Columns there are the product different version.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;On the top of that, it is quite convenient to keep an &lt;a href="https://github.com/dimanikulin/fva/projects/4"&gt;online roadmap&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>product</category>
      <category>photoorganizer</category>
      <category>search</category>
      <category>roadmap</category>
    </item>
    <item>
      <title>Why I decided to create my photo organizer</title>
      <dc:creator>Dima Nikulin</dc:creator>
      <pubDate>Sun, 12 Feb 2023 12:31:37 +0000</pubDate>
      <link>https://forem.com/dimanikulin/why-i-decided-to-create-my-photo-organizer-1g7n</link>
      <guid>https://forem.com/dimanikulin/why-i-decided-to-create-my-photo-organizer-1g7n</guid>
      <description>&lt;p&gt;As a child, I used to flip through family photo album to see my relatives whom I had not seen in real life.&lt;/p&gt;

&lt;p&gt;At that time we had film cameras only, so the number of photos was not so large.&lt;/p&gt;

&lt;p&gt;Time has passed and currently, let's say, almost everyone owns a camera or a smartphone with a camera, or even both.&lt;br&gt;
Given that, the size of my photo album increased significantly. However, I think it's not just for me.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F42z077ryqc5ddn4vluly.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F42z077ryqc5ddn4vluly.gif" alt="An average photo album" width="1200" height="675"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Once my friend and me decided to recall an event we both attended. We took my photo album and tried to search there. &lt;br&gt;
That time my album kept more than 30 thousand items inside. That search process looked like&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Flalobjp1kji81g6ldpc3.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Flalobjp1kji81g6ldpc3.gif" alt="A search in photo album with 30 thousand photos" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Of course, we didn't find anything. Therefore, I started looking for a solution to be able to search in &lt;a href="https://github.com/dimanikulin/dimanikulin/blob/master/MultimediaData.md" rel="noopener noreferrer"&gt;Multimedia Data&lt;/a&gt; in an automatic way. &lt;br&gt;
The solution I found were &lt;a href="https://github.com/dimanikulin/dimanikulin/blob/master/MultimediaIRSystems.md" rel="noopener noreferrer"&gt;Multimedia IR systems&lt;/a&gt;. &lt;/p&gt;

&lt;p&gt;I decided to use &lt;a href="https://www.digikam.org/" rel="noopener noreferrer"&gt;digiKam&lt;/a&gt; as Offline &lt;a href="https://github.com/dimanikulin/dimanikulin/blob/master/MultimediaIRSystems.md" rel="noopener noreferrer"&gt;Multimedia IR systems&lt;/a&gt; &lt;br&gt;
and &lt;a href="https://www.synology.com/en-global/dsm/feature/moments" rel="noopener noreferrer"&gt;Synology Moments&lt;/a&gt; as Online &lt;a href="https://github.com/dimanikulin/dimanikulin/blob/master/MultimediaIRSystems.md" rel="noopener noreferrer"&gt;Multimedia IR systems&lt;/a&gt;.&lt;br&gt;
Please note, that they were selected solely based on author's criteria, and there is no aim to advertise anyone.&lt;/p&gt;

&lt;p&gt;Then I started using it... &lt;/p&gt;

&lt;p&gt;What I discovered in a flash is that current &lt;a href="https://github.com/dimanikulin/dimanikulin/blob/master/MultimediaIRSystems.md" rel="noopener noreferrer"&gt;Multimedia IR systems&lt;/a&gt; do not provide a flexible and automated functionality to import &lt;a href="https://github.com/dimanikulin/dimanikulin/blob/master/MultimediaData.md" rel="noopener noreferrer"&gt;Multimedia Data&lt;/a&gt; into &lt;a href="https://github.com/dimanikulin/dimanikulin/blob/master/MultimediaIRSystems.md" rel="noopener noreferrer"&gt;Multimedia IR systems&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;But that wasn't the only problem.&lt;/p&gt;

&lt;p&gt;I realized that I need &lt;a href="https://github.com/dimanikulin/dimanikulin/blob/master/MultimediaOrganizers.md" rel="noopener noreferrer"&gt;Multimedia Organizer&lt;/a&gt; as well.&lt;br&gt;
Unfortunately, I didn't find a &lt;a href="https://github.com/dimanikulin/dimanikulin/blob/master/MultimediaOrganizers.md" rel="noopener noreferrer"&gt;Multimedia Organizer&lt;/a&gt; that could fully satisfy my needs (fixing problem metadata, working with &lt;strong&gt;digiKam&lt;/strong&gt; and &lt;strong&gt;Synology&lt;/strong&gt; etc.)&lt;br&gt;
That's why I started creating my &lt;a href="https://github.com/dimanikulin/fva" rel="noopener noreferrer"&gt;own product&lt;/a&gt; to cover my needs. &lt;/p&gt;

&lt;p&gt;Honestly, I didn't expect that it would be so hard and in the meantime so interesting.&lt;/p&gt;

</description>
      <category>cryptocurrency</category>
      <category>blockchain</category>
      <category>security</category>
      <category>discuss</category>
    </item>
    <item>
      <title>What are the Photo Organizers?</title>
      <dc:creator>Dima Nikulin</dc:creator>
      <pubDate>Sun, 18 Sep 2022 14:16:59 +0000</pubDate>
      <link>https://forem.com/dimanikulin/what-are-the-photo-organizers-1na9</link>
      <guid>https://forem.com/dimanikulin/what-are-the-photo-organizers-1na9</guid>
      <description>&lt;h2&gt;
  
  
  Multimedia Organizers functions
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;They currently perform the search in photo set by organizing the photos based on their date, location, categories, etc.;&lt;/li&gt;
&lt;li&gt;They suggest to create a folder structure and put the files on it;&lt;/li&gt;
&lt;li&gt;They make automation for the import of the new photos into IR Multimedia Systems.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;    &lt;br&gt;
Also they make photo albums more searchable (that is driven by IR Multimedia Systems) by enriching the metadata (and improving its consistency) with minimal human involvement.&lt;/p&gt;

&lt;p&gt;    Therefore, they are chosen as a subject for the overview and comparison. &lt;br&gt;
&lt;a href="https://www.pixpa.com/blog/photo-organiser"&gt;This&lt;/a&gt; provides the list of Photo Organizers for professional photographers and those organizers can be used by a usual user with a big photo album. &lt;br&gt;
There are even relevant &lt;a href="https://www.organizepictures.com/organize-digital-photos-course"&gt;online courses&lt;/a&gt; available to guide the user how to organize the photos.&lt;br&gt;
The more detailed comparison of photo organizers is provided by Wikipedia and available &lt;a href="https://en.wikipedia.org/wiki/Image_organizer"&gt;here&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--rar2m7S7--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/u9v4tgfi7uv6wdkrbyhg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--rar2m7S7--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/u9v4tgfi7uv6wdkrbyhg.png" alt="Multimedia Organizer" width="880" height="495"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Multimedia Organizer requirements
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;They shall be able to identify of inconsistent or not existing photo metadata;&lt;/li&gt;
&lt;li&gt;They shall be able to suggest the ways to solve the inconsistency and absence;&lt;/li&gt;
&lt;li&gt;The most automated approach possible should be used because a user is going to work with a large number of items;&lt;/li&gt;
&lt;li&gt;A toolset available for a usual user and not for the enterprises shall be used as well.&lt;/li&gt;
&lt;li&gt;They shall provide integration with such Multimedia IR Systems like digiKam and Synology Moments.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Multimedia Organizer approaches to create folder structure
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;The idea is to avoid photos having the same file name in the folder.&lt;/li&gt;
&lt;li&gt;The folder name can be something like Date_Shoot-Type_Event Name;&lt;/li&gt;
&lt;li&gt;It can also include a location or any other information the user wants;&lt;/li&gt;
&lt;li&gt;In such a way the user can create subfolders based on the number of photographers or cameras;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>tutorial</category>
      <category>multimedia</category>
      <category>ir</category>
      <category>search</category>
    </item>
  </channel>
</rss>
