Как создать программу на компьютере самому
Перейти к содержимому

Как создать программу на компьютере самому

  • автор:

Создание собственного программного обеспечения Windows

Как создать программу

Ежедневно каждый активный пользователь компьютера сталкивается с работой в разных программах. Они призваны облегчить работу за ПК и выполняют определенный ряд функций. Например, калькулятор подсчитывает заданные примеры, в текстовом редакторе вы создаете документы любой сложности, а через плеер просматриваете любимые фильмы или слушаете музыку. Весь этот софт был создан с помощью языков программирования, начиная от основных элементов управления, и заканчивая графическим интерфейсом. Сегодня мы бы хотели обсудить два метода собственноручного написания простых приложений для операционной системы Windows.

Создаем собственное программное обеспечение для Windows

Сейчас разработать свою программу можно и без знания языков программирования, однако для этого существует совсем мало подходящих средств, позволяющих в полной мере реализовать задуманное. К тому же сейчас на просторах интернета бесплатно доступно множество курсов по ЯП, описывающих примеры написания софта с предоставлением исходного кода. Поэтому поставленная задача вполне реализуема, нужно лишь выбрать метод, что мы и предлагаем сделать далее.

Способ 1: Программы для написания программ

Если вы интересовались созданием игр, то знаете о специальных инструментах, куда уже встроено множество компонентов и записаны основные скрипты. Юзеру остается лишь создать из этого цельную картину, систематизируя имеющиеся данные. Примерно по такому же принципу работает и ПО, позволяющее создавать собственные приложения без знания языков программирования. За пример мы взяли HiAsm, поскольку это единственное оптимальное решение с полной локализацией на русский язык.

  1. Сразу приступим к рассмотрению простой инструкции по созданию примитивной программы в HiAsm. Для начала перейдите по указанной выше ссылке, чтобы скачать и установить используемый сегодня инструмент.
  2. После запуска ознакомьтесь с представленной информацией по использованию и решению частых проблем. Сразу хотим отметить, что некоторые антивирусы распознают HiAsm как вредоносный код, блокируя запускающиеся файлы. Поэтому при возникновении неполадок рекомендуем добавить инструмент в исключения или на время выключать защиту операционной системы. Инструкция по использованию программного обеспечения HiAsm Studio
  3. Через меню «Файл» создайте новый проект. Переход к созданию нового проекта в программе HiAsm Studio

Возможностей рассмотренного инструмента хватит не только для того, чтобы создать простое графическое приложение. HiAsm вполне справляется и с гораздо сложными работами, например, созданием проигрывателя или загрузчика файлов из интернета. Конечно, здесь придется приложить намного больше усилий и выучить множество схем и встроенных скриптов. Все это намного проще освоить, если использовать официальные ресурсы, например, форум. Там пользователи не только делятся своими работами, но и объясняют начинающим азы конструирования ПО. Тем более при возникновении вопросов ничего не мешает вам создать отдельную тему, подробно описав сложившуюся трудность.

Способ 2: Язык программирования и среда разработки

Как уже было сказано ранее, абсолютно все программы пишутся на определенном языке программирования. В некоторых сложных проектах бывает задействовано сразу несколько ЯП. Такой способ написания софта самый сложный, но при освоении одного из языков вы получаете практически безграничные возможности в кодировании программного обеспечения, утилит или отдельных скриптов. Главная задача — определиться с языком программирования. На этот вопрос постарались дать ответ специалисты из известного обучающего сервиса GeekBrains. Всю необходимую информацию вы найдете по указанной ниже ссылке.

Теперь же давайте рассмотрим несколько вариантов обеспечения, написанного при помощи упомянутых в статье ЯП. В первую очередь затронем Python, который некоторые программисты считают самым простым языком. Чтобы на экране появилось простое графическое окно размером на весь экран, придется подключить стандартную библиотеку Tkinter и написать код такого формата:

from tkinter import *

class Paint(Frame):
def __init__(self, parent):
Frame.__init__(self, parent)
self.parent = parent

def main():
root = Tk()
root.geometry(«1920×1080+300+300»)
app = Paint(root)
root.mainloop()

if __name__ == «__main__»:
main()

Отображение окна созданного на языке программирования Python

Далее добавляется код, который вы видите на скриншоте ниже. Он реализует примерно такие же функции, как стандартная программа Paint.

Открывок кода графического приложения на Python

После успешной компиляции запускается графическое окно с уже добавленными кнопками. Каждая из них отвечает за размер кисти и цвет.

Внешний вид графического приложения на Python

Как видите, разобраться в приложениях с GUI (графическим интерфейсом) не так уж и сложно, однако сначала лучше начать с консольных скриптов и небольших программ. Освоить Python вам помогут свободные материалы, уроки и литература, которой сейчас вполне достаточно, чтобы самостоятельно изучить необходимый материал.

В приведенной статье на GeekBrains отдельное внимание уделено и C#, который называют универсальным языком программирования для тех, кто еще не определился, в какой области хочет применять свои навыки. Разработка ПО для Windows ведется в официальной среде от Microsoft под названием Visual Studio. Код внешне выглядит так, как вы видите ниже:

namespace MyWinApp
<
using System;
using System.Windows.Forms;

public class MainForm : Form
<
// запускаем приложение
public static int Main(string[] args)
<
Application.Run(new MainForm());
return 0;
>
>
>

Как видите, существуют определенные различия с тем же Python. Если скопировать этот код, вставить его в IDE и скомпилировать, на экране появится простейшее графическое окно, куда уже в дальнейшем и будут прикрепляться кнопки, блоки и другие объекты.

Внешний вид графического приложения на языке C#

Мы упомянули о Visual Studio как о среде разработки. Она понадобится в любом случае, если вы хотите писать собственный софт на ЯП, поскольку стандартный блокнот или текстовый редактор для этого практически не подходит. Ознакомиться с лучшими IDE, поддерживающими разные языки, мы советуем в отдельной нашей статье от другого автора далее.

В рамках этой статьи мы постарались максимально детально ознакомить вас с процессом написания программного обеспечения с помощью двух доступных методов. Как видите, дело это не совсем простое, ведь нужно получать специальные знания и учить многие аспекты, чтобы освоиться в этом деле. Приведенный выше материал был нацелен лишь на предоставление общей информации для ознакомления и не является полноценным уроком, освоив который, можно стать уверенным программистом. Если вас заинтересовал какой-либо ЯП или HiAsm, потребуется уделить много времени на изучение соответствующих обучающих материалов.

Первый опыт написания полноценной программы

Каждый начинающий программист мечтает реализовать свой собственный проект. Не написать простенький код, по заданию преподавателя, а воплотить в жизнь свои идеи. Так и я, изучая C++ 3-4 месяца, решился попробовать разработать макет электронного журнала для преподавателей.

Определившись с темой, приступил к определению необходимых функций программы. Для этого я провел анализ уже существующих сервисов, выполняющих похожие задачи.

По итогу, пришел к выводу, что в программе потребуется реализовать:

Выбор группы (GroupSelection),

Возможность выставлять оценки (Grades),

Возможность выставлять посещаемость (Attendance),

Возможность писать комментарии к датам (Comment),

Возможность устанавливать dedlin’ы (Deadline).

Для понимания логики работы программы, отражения принципов взаимодействия с ней, упрощения дальнейшего написания кода, была создана полная блок-схема.

блок-схема программы

блок-схема программы

Аналогично, были созданы блок схемы для каждой функции.

авторизацияавторизация регистрациярегистрация выбор группывыбор группы выставление оценоквыставление оценок простановка посещаемостипростановка посещаемости написание комментариев к датамнаписание комментариев к датам установка dedlin’овустановка dedlin’ов

Написание кода программы

Первым шагом написания программы является добавления необходимых заголовочных файлов, а именно:

iostream — заголовочный файл с классами, функциями и переменными для организации ввода-вывода.

string — это заголовочный файл для взаимодействия с
классами string (строками).

fstream — заголовочный файл, включающий набор классов, методов и функций, которые предоставляют интерфейс для чтения/записи данных из/в файл.

Далее была добавлена глобальная переменная, то есть переменная, область действия которой охватывает всю программу. Использование такой переменной потребовалось для реализации удобного взаимодействия с информацией.

Чтобы удобно группировать данных в одной переменной для каждого объекта, который оперирует этими данными, мною было объявлено несколько классов, а именно:

Класс данных о преподавателе – DataofTeature.

Класс данных о студенте – DataofStudent.

Основываясь на ранее представленных блок схемах, был написан код для всех функций. Разберемся с каждой функций подробнее.

Функция Reg реализует полноценную регистрацию, с записью данных о пользователе в текстовый файл.

В ходе выполнения функции, пользователю предлагается ввести ФИО, логин и пароль. После получения программой логина, проверяется его наличие в системе, если логин совпадает с ранее записанным в базу логинов, то пользователя предлагается ввести логин повторно. Как только программа получает ФИО, пароль и уникальный логин, происходит запись логина в базу для логинов (при открытие базы данных используется режим открытия ios_base::app, позволяющий открыть файл для записи в конец файла, при этом, сохраняя ранее записанные данные), создание специализированного файла для регистрационных данных пользователя, и запись в него ФИО, аналогично создается специальный файл для хранения логина и пароля конкретного пользователя. Формирования уникальных файлов происходит по принципу сложения строк. Например, path=path+teature1.login+txt, где path-путь к директории, в которой хранятся файлы программы, teature1.login – уникальный логин пользователя, txt- строка, хранящая в себе “.txt”.

Authon

Функция Authon реализует авторизацию пользователя в программу.

В ходе выполнения функции, пользователю предлагается ввести логин и пароль. Следом идет проверка наличия логина в базе логинов, если логина в базе нет, пользователю
предлагается ввести логин повторно. Получив логин, программа открывает
специализированный файл пользователя, получая к нему путь, методом сложения
строк. В этом файле проверяется верность пароля, если пароль не совпадает, то
предлагается ввести пароль повторно. Как только все данные проверены, программа
открывает файл с ФИО пользователя и выводит на экран приветствие, используя ФИО
пользователя.

GroupSelection

Функция реализует полноценный выбор группы в программе.

В ходе выполнения функции на экран выводится полный список групп, содержащихся в системе. Пользователю предоставляется возможность ввести название необходимой ему группы. После получения программой наименования, происходит проверка на наличие данной группы в списке групп, если такая группа отсутствует, то пользователю предлагается ввести название группы повторно. Как только проверка пройдена, название группы передается в глобальную переменную, для дальнейшего использования в других функциях.

Grades

Функция Grades реализует, простановку оценок студентам.

В ходе выполнения функции, пользователю предлагается ввести дату, за которую он хочет выставить оценку. После получения программой даты, происходит проверка на существование файла с оценками на данную дату. Если файл существует, то происходит его запись в специализированный промежуточный файл, это происходит для реализации корректной и органичной записи в файл отметок, без потерь данных. Если файл не существует, то программа копирует данные из файла со списком группы в промежуточный файл. Следом, на экран выводится полный список группы с отметками (если они есть). Пользователю предлагается ввести фамилию и имя студента, которому он хочет выставить оценку. Как только программа получает эти данные, происходит проверка на наличие данного студента в группе, если его нет, то пользователю предлагается ввести фамилию и имя повторно. После получения данных программой, происходит создание файла для оценок на данную дату (принцип нахождения пути файла и формирования его название – сложение строк). Следом, идет поиск данного студента в промежуточном файле. Принцип поиска и записи таков: если фамилия и имя не совпадает с введенными пользователем, то происходит запись этих данных в файл с оценками, если ФИ совпали, то пользователю предлагается ввести студенту оценку, полученная строчка записывается в файл с оценками. В конце работы функции, на экран выводится список группы с внесенными изменениями.

Attendance

Функция Attendance реализует простановку посещаемости студентов с последующей записью в файл.

В ходе выполнения функции, пользователю предлагается ввести дату, за которую он хочет выставить посещаемость. После получения программой даты, происходит проверка на существование файла с посещаемостью на данную дату. Если файл существует, то происходит его запись в специализированный промежуточный файл, это происходит для реализации корректной и органичной записи в файл посещаемости, без потерь данных. Если файл не существует, то программа копирует данные из файла со списком группы в промежуточный файл. Следом, на экран выводится полный список группы с посещаемостью (если она есть). Пользователю предлагается ввести фамилию и имя студента, которому он хочет выставить посещаемость. Как только программа получает эти данные, происходит проверка на наличие данного студента в группе, если его нет, то пользователю предлагается ввести фамилию и имя повторно. После получения данных программой, происходит создание файла для посещаемости на данную дату (принцип нахождения пути файла и формирования его название – сложение строк). Следом, идет поиск данного студента в промежуточном файле. Принцип поиска и записи таков: если фамилия и имя не совпадает с введенными пользователем, то происходит запись этих данных в файл с оценками, если ФИ совпали, то пользователю предлагается ввести посещаемость студента, полученная строчка записывается в файл с посещаемостью. В конце работы функции, на экран выводится список группы с внесенными изменениями.

Comment

Функция Comment реализует в программе написание комментария к дате.

В ходе выполнения функции, пользователю предлагается ввести дату, для которой он хочет написать комментарий. При получении программой даты, происходит открытие файла с режимом открытия ios_base::app (открыть файл для записи в конец файла). Наименование файла и путь его нахождения формируется, путем сложения строк. Пользователю предлагается ввести комментарий. Происходит запись данных в файл. После на экран выводятся изменённые данные файла.

Deadline

Функция Deadline реализует в программе создание dedlin’а и комментария к нему, с записью этих данных в файл.

В ходе выполнения функции, пользователю предлагается ввести дату, на которую он хочет установить deadline. При получении программой даты, происходит открытие файла с режимом открытия ios_base::app (открыть файл для записи в конец файла). Наименование файла и путь его нахождения формируется, путем сложения строк. Пользователю предлагается ввести комментарий. Происходит запись данных в файл. После на экран выводятся изменённые данные файла.

Аналогично, основываясь на блок схеме, был написан код основной части программы.

В ходе выполнения программы, на экран выводится меню. Пользователю предлагается выбрать один из пунктов. При выборе пункта 1, вызывается функция Reg, а затем функция Authon; При выборе пункта 2, вызывается функция Authon; При выборе пункта 3 происходит выход из программы. После успешной авторизации вызывается функция GroupSelection. После выбора группы на экран выводится меню дальнейших действий. Пользователю предлагается выбрать один из пунктов. При выборе пункта 1 вызывается функция Grades; При выборе пункта 2 вызывается функция Attendance; При выборе пункта 3 вызывается функция Deadline; При выборе пункта 4 вызывается функция Comment; При выборе пункта 5 происходит выход из программы.

Для реализации полноценной работоспособности моей программы необходимо создать несколько текстовых файлов и директорий согласно диаграмме.

диаграммадиаграмма

В файл allgroup.txt необходимо записать название группы. Также папке allgroup нужно создать папку с название группы и текстовый документ с названием группы, в который необходимо занести список группы.

Тестирование и отладка программы

Для проведения корректного и полного тестирования следует поставить несколько тест кейсов, а именно.

Тестирование работы регистрацииТестирование работы регистрации Тестирование авторизацииТестирование авторизации Тестирование выбора группыТестирование выбора группы Тестирование постановки оценки Тестирование постановки оценки Тестирование постановки посещаемости Тестирование постановки посещаемости Тестирование установки даты конца дедлайнаТестирование установки даты конца дедлайна Тестирование написания комментария к дате Тестирование написания комментария к дате

В ходе тестирования программы критических ошибок выявлено не было.

Заключение

По итогу у меня получилось разработать макет электронного журнала для преподавателей, содержащий следующие компоненты:

Класс DataofTeature, хранящий в себе информацию о преподавателе.

Класс DataofStudent, хранящий в себе информацию о студенте.

Функция Reg, реализующая регистраци.

Функцию Authon, реализующая авторизацию в программу.

Функция GroupSelection, реализующая выбор группы.

Функция Grades, реализующая простановку оценок.

Функция Attendance, реализующая простановку посещаемости.

Функция Comment, отвечающая за возможность написания комментария к дате.

Функция Deadline, дающая возможность установить дэдлайн и написать к нему комментарий.

Функция main, в которой реализовано основное взаимодействие пользователя с программой (меню и т.д.).

Весь код программы был написан в среде разработки Visual Studio 2022. Суммарный объем строк в тексте программы составляет 724.

Windows: Как создать программу

Cоздать программу самому? Это очень просто! Не верите? Давайте сделаем небольшую программу, которая станет вашей отправной точкой в мир программирования.

Многие из нас постоянно работают с программами, сложными и попроще, но многие не задумываются, а что-же на самом деле есть программа. Если описать коротко, то программа — это набор инструкций, которые отдаются компьютеру в соответствии с логикой, которую в программу заложил программист.

Не буду рассуждать на тему зачем может потребоваться писать самостоятельно программу, у каждого свои причины. Оговорюсь сразу, что в данной статье будет использоваться язык программирования C# и среда разработки Microsoft Visual Studio, у которой имеется бесплатная редакция, возможностей которой хватит «за глаза» любому.

Оглавление к статье

  1. Этапы создания программы
  2. Установка среды разработки
  3. Создание программы

1 . Этапы создания программы

Писать программу ради написания программы является не совсем хорошей идеей. Целью написания программы должно быть решение определенной задачи, с которой написанная программа должна помочь вам справиться.

Из выше сказанного, написание программы можно разделить на следующие этапы:

  1. Определение цели, какую задачу ваша программа помочь вам решить
  2. Разработка алгоритма работы программы.
  3. Дизайн пользовательского интерфейса.
  4. Написание логики программы. На этом этапе вдыхается жизнь в вашу програму. Это и есть наиболее важный этап создания программы, для успешной реализации которого понадобится много знаний и умений.
    Где взять знания и умения? Книги, профильные сайты, курсы. Сейчас в интернете можно найти бесчисленное множество обучающих материалов, посвященных данной теме.
    Отдельно хочется упомянуть ресурсы для освоения C#:

  • бесплатную книгу Fundamentals of Computer Programming with C#
  • сайт METANIT.COM
  • Документация по C# на сайте Microsoft

2 . Установка среды разработки

Так как большинство из нас не гениальные мальчики и девочки, родившиеся с клавиатурой в руках и не впитали языки программирования с молоком матери, нам понадобится текстовый редактор более функциональный и наглядный чем блокнот.

Да, в блокноте вполне реально создать программу, но на это у вас уйдет гораздо больше времени и такими «извращениями» могут заниматься реально крутые программисты. Для остальных-же Microsoft Visual Studio — это именно тот инструмент, который будет помогать создавать новые и управлять существующими проэктами.

Из ключевых возможностей Visual Studio хочется отметить:

  • Разработка для популярных платформ Windows, Linux, MacOS
  • Веб разработка: ASP.NET, Node.js, Python, JavaScript, and TypeScript
  • Популярные языки программирования: C#, C++, Visual Basic, Python, JavaScript
  • Визуальное редактирование пользовательского интерфейса
  • IntelliSense — интеректуальный помощник при написании кода
  • Управление версиями. Интеграция с GitHub
  • Совместная разработка
  • Расширение возможностей путем установки дополнений.

Поэтому Microsoft Visual Studio — это именно то, с чего стоит начать свою карьеру программиста.

Примечание.
Ранее, когда Visual Studio не была бесплатной, как альтернативу можно было рассматривать SharpDevelop, бесплатную IDE с открытым исходным кодом, которая предоставляла функционал сходный с Visual Studio и в некоторых случаях его было достаточно для создания проэктов любой сложности. Но теперь, в виду стагнации процесса разработки SharpDevelop, и стремительного развития Visual Studio, альтернативы продукту от Microsoft просто нет.

Загрузите и установите последнюю версию, которая доступна для загрузки на сайте разработчика. С этим не должно возникнуть сложностей. После установки запустите среду разработки.

3 . Создание программы

Давайте создадим программу — калькулятор. Почему-бы и нет? Изобретать велосипед — это-же так весело! 🙂 А если серъезно, то ничего зазорного в этом нет, ведь клепают-же хелловорлды во всех учебниках и не стесняются. Мы в этом плане даже чем-то лучше.

Как уже оговаривалось выше, язык программирования будет использован C#,

  1. Нажимаем кнопку Create a new project.
  2. Шаг Create new project:

  • Язык программирования: C#
  • Платформа: Windows
  • Тип проекта: Desktop

Открылось главное окно Visual Studio,

Перетащите кнопку Button на форму главного окна, только что созданного проекта.

Эта кнопка не делает ничего связанного с вычислениями — при её нажатии будет закрываться программа. На примере этой кнопки вы увидите насколько просто наполнять окно программы необходимыми элементами пользовательского интерфейса.

Настройте только что добавленную кнопку в панели свойств:

  • Свойство Text, меняем значение на Close
  • Name меняем на bnClose
  • Anchor: Bottom,Right

Добавьте обработчик события нажатия кнопки: делаем двойное нажатие на кнопке, программа автоматически создаст необходимый метод bnClose_Click. Внутри метода пишем: this.Close();

При нажатии кнопки Close, окно программы закроется, в след за этим завершит работу и сама программа.

Примечание
За всеми проделанными выше действиями с созданием конпки и редактирования ее свойств, лежит создание кода программы средой разработки VisualStudio.

Откойте файл Form1.Designer.cs. Как видите, все те действия, что вы делали в настройках, отображены здесь в виде кода программы:

То-есть для среды разработки, элементы управления окна выглядят в виде кода, но для удобства, настройки графического интерфейса создаваемой программы в VisualStudio можно делать в наглядном визуальном представлении.

Примечание
Если вы поставили Visual Studio и хотите изменить язык интерфейса на другой язык, то это можно сделать в настройках программы Tools — Options — Internetional Settings. Если языка, который вам нужен нет в списке, доустановите его через Microsoft Visual Studio Installer. После этого опять откройте Tools — Options — Internetional Settings, и измените язык интерфейса.

Сделаем что-нибудь посложнее, чем просто вывод текста на экран

В большинстве учебников для начинающих программистов первая программа выводит простое сообщение «Hello world!». Мне кажется это немного тупо, так как для того, чтоб заинтересовать начинающего программиста, нужно показать нечто большее и полезное, нежели просто окно с текстом.

Для того чтоб оценить возможности языка программирования C# и .Net Framework, давайте в нашей программе реализуем возможность выполнения простейших арифметических операций. Мне кажется это будет гораздо полезней.

Итак, давайте создадим следующие элементы интерфейса программы

  • Text: «+»
  • Name: bnPlus
  • Text: «-«
  • Name: bnMinus
  • Text: «*»
  • Name: bnMult
  • Text: «/»
  • Name: bnDiv
  • Name: tbOperand1
  • Name: tbOperand2
  • Name: tbResult
  • Name: lblOperand1
  • Name: lblOperand2

Примечание: Очень удобно использовать копирование элементов пользовательского интерфейса. Для того, чтоб это сделать, нужно выделить элементы, которые нужно скопировать и при нажатой кнопке Ctrl, потянуть мышью выделенные элементы в сторону.

Как видите, добавлять элементы интерфейса программы весьма просто — перетягиваем их из панели инструментов (или создаем копии уже существующих) в то место окна, где должен находиться элемент, изменяем размер, свойства и положение.

Попробуйте закончить настройку внешнего вида программы, чтоб она стала выглядеть так:

Высота текстового поля tbResult регулируется за счет изменения размера шрифта.

Обратите внимание, что имя элементов назначаются автоматически и, если не давать им осмысленные имена, и при достаточно большом их количестве, очень легко потеряться в хаосе, состоящем из элементов с названиями button1, button2, button3, textBox1, textBox2, textBox3 и так далее. Сразу после создания элементов, не ленитесь, давайте им осмысленые имена — дальше, при создании обработчиков событий, имена методов будут генерироваться автоматически на основании имени элемента управления. Думаю никто не сомневается в том, что имя метода ButtonAdd_Click() гораздо более осмысленно, чем Button1Click()

Назначим обработчики событий нажатия кнопок

Выбираем по очереди каждую кнопку.Даблкликом создаем обработчик нажатия кнопки(Click). Если нужно добавить обработчик другого события, или выбрать уже существующий метод — следует открыть вкладку События (значок в виде молнии) и там уже выбрать необходимое событие.

Пишем код обработчика

Как видите, все методы-обработчики отличаются только одним символом. Это не есть красиво, но наведением порядка в коде мы займемся немножко позже. Сейчас для наглядности путь обработчики событий нажатия кнопки остаются как есть.

Давайте на примере операции сложения разберем как работает наша программа.

Из курса школьной программы математики мы знаем, что действия, заключенные в скобки выполняются в первую очередь. В программировании то-же самое:

  1. float.Parse(tbOperand1.Text) — Извлекается значение свойства Text переменной tbOperand1 и передается в качестве параметра статичскому методу Parse() типа System.Single результат записывается в промежуточную переменную A
  2. float.Parse(tbOperand2.Text) — то-же самое, результат записывается в промежуточную переменную B
  3. Производится сложение промежуточных переменных (A + B) в промежуточную переменную C
  4. C.ToString() — Преобразовуется переменная C в строку. Так как любая переменная в C# это объект, то путем обращения к методу ToString() этого объекта мы можем получить его строковое представление.

Более сложные типы, такие как DateTime, могут иметь несколько мeтодов ToString().

Проверяем работу программы

Нажмите кнопку Пуск на панели инструментов, или нажмите клавишу F5

Программа работает и делает то, что от нее требовалось:

Обратите внимание, что я пока не реализовал проверку вводимого значения в текстовое поле. Если ввести в него некорректное значение — программа выдаст сообщение об ошибке, в которой сообщается, что вы пытаетесь преобразовать в числовое значение неправильную строку:

Давайте теперь перепишем программу, чтоб она могла выводить предупреждение, в случае, если было введено некорректное значение одного из операторов. Скопируйте следующий метод к себе в файл Form1.cs, там где находятся остальные обработчики *_Click:

Этот метод принимает параметр object sender, который используется для определения того, какая кнопка была нажата. Здесь использован основополагающий принцип ООП — Полиморфизм. Объект типа Button можно абстрагировать до типа object, но при этом информация, специфичная для типа Button никуда не пропала — для того, чтоб к ней обратиться, нужно sender привести к типу Button. Например:

Теперь перейдите в конструктор формы (Shift + F7) и для каждой кнопки, в качестве обработчика события Click выберите метод bnMathAction_Click.

Если перейти к коду, то можно увидеть, что ссылок на этот метод стало четыре, а на остальные методы обработчики теперь никто не ссылается — ссылок ноль. Их можно спокойно удалить.

В итоге вы должны получить файл Form1.cs следующего вида:

Как я пишу программы

Рассказываю об этом на двух примерах. Рассказано про всё: сбор идей, планирование, структуры данных, todo-списки, написание кода.

16 августа 2021

| �� 39 мин

#Введение

Программирование — не только написание кода, но и ещё планирование кода; определение того какие фичи нужны, а какие нет. У меня есть своя система, определяющая: как заниматься планированием программ, фич; как организовывать себя; как не забывать идеи. И я хочу в этой статье рассказать об этом. Что-то в этой системе придумал сам, что-то украл у других людей.

Эта статья может быть полезна начинающим программистам.

#На примере программы для изучения английских слов

Недавно я сделал программу с графическим интерфейсом для изучения английских слов. Перед её созданием сразу решил что напишу эту статью, и поэтому сразу начал замерять время каждого действия вместе с документированием написания кода, идей и выполнения туду-пунктов.

В итоге эту програму я довёл до абсолютного конца за ≈40 часов чистого времени. Мне не нужны какие-то фичи, ничего не болит. Что очень необычно для пет-проекта, ведь их главное свойство, что они начинаются, но никогда не заканчиваются.

# 2 Создание продукта

# 3 Сбор идей

Перед тем как делать какой-то проект вы всегда знаете что хотите получить программу с какими-то конкретными фичами, чтобы если вы сделали то-то, случалось это. Вы не знаете как она должна работать в каждой конкретной детали, но точно знаете что без каких-то деталей делать её нет смысла. Это всё надо записать и систематизировать, чтобы далее от этого отталкиваться при написании кода.

# 4 Беспорядочный сбор идей

Я беру файлик и называю его ideas.md . Теперь в нём будут лежать все идеи по данному проекту.

Сначала надо просто накидать всё что лежит в голове без всякого порядка. Я набросал, затем перечитывал это по многу раз и вносил те элементы что ещё не записал. Причём я записывал все идеи, даже самые безумные, мало ли что потом может пригодиться или случиться.

На беспорядочный сбор идей ушло 20 минут, и в результате получился такой файл:

(желательно его не читать, а просто увидеть масштаб)

  • Хотелось бы загружать из текста и из субтитров, чтобы была кнопка, которая читает буфер обмена
    • Чтобы при добавлении субтитров или текста, смотрелись все слова, и те что уже известны или выучены, не добавлялись, а новые слова показывались для дальнейшего добавления
    • Известные или выученные слова фильтруются
    • Показывается английское слово
    • Предлагается добавить его русский перевод вручную
    • Либо есть кнопка "я уже знаю это слово"
    • Слово, которое не набиралось ни разу, надо сначала ввести n раз
    • Слова, которые 5 раз отвечались правильно, считаются на сегодня законченными
    • Слова, которые отвечаются неправильно, получают рейтинг -2
    • Так же контроллируется дата, когда человек отвечал и как. Если некоторое слово долго не набиралось, то необходимо его повторить, причем если до этого повторение работало хорошо, то приоритет меньший.
    • Только когда слово зарабатывает рейтинг кратный 5, то в записях фиксируется дата, когда это было сделано
    • Слова, которые не набирались 5 раз
    • Слова, которые имеют отрицательный рейтинг
    • Слова, которые имеют рейтинг меньше 5
    • Слова, которые имеют рейтинг выше 5, но весь этот рейтинг был заработан свыше 5 дней назад
    • Слова, которые имеют рейтинг выше 10, но весь этот рейтинг был заработан свыше 5 дней назад
    • Слова, которые имеют рейтинг выше 15, но весь этот рейтинг был заработан свыше 20 дней назад (слова, которые давно не повторялись)
    • Слова, которые имеют рейтинг выше 20, но весь этот рейтинг был заработан свыше 20 дней назад
    • Всё, больше точно не надо
    • Не соотносится с многозначностью слов, пусть будет просто N полей с не важно какой длиной
    • Для данного английского слова хранится множество пар русских слов, аналогично наоборот
    • Если сейчас показывается многозначное английское слово, то внизу нужно ввести все добавленные его русские смыслы
    • В статистике оценивается пара (русское слово, английское слово)
    • Если какое-то значение многозначного слова уже выучено или не требует повторения, то оно не показывается для ввода, оно просто показывается текстом, чтобы можно было понять какие смыслы введены, а какие нет
    • Для каждого слова запоминается сколько раз его печатали, сколько правильно, сколько неправильно.
    • Для каждого дня запоминается сколько слов за сегодня отработано по полной, сколько слов отработано вообще итд.
    • Попробовать рисовать статистику через графики egui.
    • Ведётся количество новых добавленных слов в день
    • Где-то должно быть окошко чтобы посмотреть просто количество всех слов в системе, количество выученных слов и количество изучаемых слов

    Кстати, на этом этапе крайне приятно владеть быстрой слепой печатью, чтобы писать много текста и не отвлекаться процессом печати.

    # 4 Систематизация идей

    У меня есть принцип, что что-то надо систематизировать и разбирать на категории только в двух случаях:

    • Когда ты точно знаешь что эта категория использовалась ранее и она работает.
    • У тебя есть критическая масса элементов этой категории.

    Поэтому в прошлом пункте идеи писались беспорядочно, а теперь можно заняться их систематизацией, ведь только сейчас можно увидеть какие категории присутствуют, а какие отстутсвуют.

    На это тоже ушло 20 минут.

    Я хотел написать программу как можно быстрее, и как можно быстрее получать результат, поэтому я разделил идеи на разные категории, постарался выбрать такие идеи, чтобы реализовать первую рабочую версию (MVP) можно было максимально быстро.

    Поэтому была создана категория «сложные идеи», куда я уносил то что хочу реализовать, но что точно не должно быть в первой итерации.

    В итоге файл с идеями теперь выглядит так:

    систематизированные идеи

    Реализовать в первую очередь

    • Общий интерфейс
      • Добавление слов
        • Через субтитры .src
        • Через текст
        • Есть две кнопки: "добавить как текст", "добавить как субтитры"
        • Известные или выученные слова фильтруются
        • Показывается английское слово
        • Предлагается добавить его русский перевод вручную (новая строка означает новый смысл)
        • Есть кнопка "добавить переводы слова"
        • Либо есть кнопка "я уже знаю это слово"
        • Вверху написано английское (или русское) слово
        • Внизу N полей для ввода всех многозначностей этого слова
        • Некоторые поля могут быть серыми с уже написанными словами, так как эти слова выучены или не требуют сейчас повторения
        • Для перехода вниз или проверки текущего слова можно нажать Enter
        • Показывается правильно или неправильно введено слово только после введения всех слов
        • Для кажого слова показывается точками сколько раз ещё предстоит его вводить на сегодня
        • Первые 2 раза слово вводится с подсказкой программы
        • Затем 3 раза нужно ввести слово по памяти на сегодня
        • Следующий раз ввести слово 5 раз нужно через день и более
        • На этом этапе слово считается наполовину выученным
        • Потом 5 раз через неделю и более
        • Потом 5 раз через месяц и более
        • После этого слово считается абсолютно выученным
        • Каждая ошибка добавляет необходимость вводить ещё один лишний раз это слово
        • Русские и английские слова даются вперемешку
        • Всё вперемешку
        • Перебирается каждое слово и смотрится, нужно ли его набирать сегодня и сколько раз
        • Для данного английского слова хранится множество пар русских слов, аналогично наоборот
        • В статистике оценивается пара (русское слово, английское слово)
        • Для каждого слова запоминается:
          • Сколько раз его печатали, сколько правильно, сколько неправильно
          • Все даты майлстоунов, когда его печатали в первый день, во второй день, черз неделю, через месяц

          сложные идеи

          • Интерфейс получения слов из текста или субтитров
            • Программа всегда видит буфер обмена, если открыто это окно
            • Внизу серым написан текст, который сейчас находится в буфере обмена
            • Показывается только 200 первых символов этого текста, далее ставится троеточие и подписано количество байт занимаемых всем текстом
            • Чтобы для данного слова можно было видеть его контекст использования
            • Когда добавлено (дата, количество дней назад)
            • Сколько раз вводилось
            • Сколько правильно, сколько неправильно
            • Все майлстоуны (дней после добавления)
            • Есть кнопочка (i) напротив каждого слова, на которую можно нажать и посмотреть статистику этого слова
            • Тебя просят включить русский язык и ввести все английские буквы, как если бы они находились при включённом английском языке
            • Аналогично при включённом английском языке просят ввести все русские буквы
            • Таким образом программа запоминает раскладку клавиатуры и сохраняет её в настройки, чтобы потом использовать чтобы не переключать раскладку клавиатуры
            • Попробовать рисовать статистику через графики egui.
            • Где-то должно быть окошко чтобы посмотреть просто количество всех слов в системе, количество выученных слов и количество изучаемых слов
            • Для каждого дня запоминается:
              • Сколько слов сегодня отработано по полной
              • Сколько попыток совершено вообще, сколько правильных, сколько неправильных
              • Сколько задолженность на сегодня
              • Сколько слов сегодня добавили
              • Как долго была включена программа (простои больше 15 секунд не учитываются)

              отсортировать

              # 3 Планирование структур данных и функций

              Только теперь, когда имеется некое видение программы, можно начать пытаться писать код. Если писать код без этапа сбора и систематизации идей, то можно забыть некоторые мелочи, которые потом придётся вставлять с большой болью.

              И начинать код лучше всего не с написания действий, а с проектирования типов/структур данных и сигнатур функций. Под структурами данных я понимаю не списки, деревья итд, а просто enum’ы и struct’ы. Я даже где-то слышал такую фразу:

              Найти нужную структуру данных — это уже значит решить половину задачи.

              И я очень согласен с этим высказыванием, действительно то как ты будешь решать всю задачу зависит от того как выглядят твои типы, особенно важную роль играют enum’ы, которые прям очень хорошо описывают предметную область.

              И поэтому я не могу понять как можно программировать на языках с динамической типизацией, где никто типы никогда не пишет. Я вообще не понимаю какой профит даёт избавление от типов, ведь в долгую это огромный проигрыш, и в короткую тоже не вижу выигрыша.

              Ещё есть идея, что чтобы удобнее было писать код, надо подумать о том как представить данные в том виде, чтобы задача в них решалась максимально естественно, и перевести их в этот формат:

              Далее я буду кидаться коммитами, начинающимися с @ . Мне кажется что оптимальным способом смотрения их будет: открыть в новой вкладке и пролистать diff, увидеть примерно что произошло. Либо можно просто их игнорировать, особо ничего не потеряете. Смотреть что происходило в коммитах может быть полезно если вам нужны прям детали как происходила моя разработка.

              Спустя два коммита (@a8549a3, @b79f219) и 1ч 20м, у меня получились следующие типы, которые далее будут являться основой всего:

              В эти структуры сразу было заложено много идей, в том числе статистика. Когда я писал этот код, то очень много перечитывал все идеи, сверялся с тем чтобы ничего не потерялось, и всё было учтено с самого начала.

              Следующим этапом приступил к планированю структур и методов для графического интерфейса. Я пишу интерфейс через ImGui, про который написал отдельную статью. Поэтому на интерфейс у меня потратится минимально времени, и планировать его максимально легко.

              Интерфейс распланировал за 32м: @0cab890, и после этого планирования даже чуть-чуть улучшились и основные структуры данных.

              # 3 Написание кода

              Далее за 1ч написал код логики: @96eb608.

              Затем за 2ч 45м написал код интерфейса до минимально рабочего состояния: @7b8de3d.

              Кстати, писать работающий код поверх распланированных функций и типов крайне приятно, код так легко и быстро идёт.

              Итак, на отметке чистого времени у нас 6ч 16м, и программа выглядит следующим образом:

              Здесь работает всего три окошка и основной функционал.

              # 3 Todo-листы

              Итак, я написал самый минимальный прототип. По идее им уже можно пользоваться.

              Нам больше не настолько нужен файлик с идеями, удаляем оттуда всё реализованное: (он стал совсем маленьким)

              идеи неизвестной полезности

              • Чтобы при добавлении слов замерялась их частотность, даже частотность известных, и она просто суммировалась к тому что уже хранится, чтобы можно было видеть частотность выученных слов. Хотя и для этого придётся какой-то сложный интерфейс пилить.
              • Интерфейс добавления слова
                • Чтобы для данного слова можно было видеть его контекст использования
                • Есть кнопочка (i) напротив каждого слова, на которую можно нажать и посмотреть статистику этого слова
                • Когда добавлено (дата, количество дней назад)
                • Сколько раз вводилось
                • Сколько правильно, сколько неправильно
                • Все майлстоуны (дней после добавления)

                И заводим файлик todo, в котором разместим конкретные todo-пункты для выполнения:

                Тут стоит отвлечься насчёт того как я веду todo-списки. Одни люди это делают через GitHub, другие через приложение на телефон, а я через расширение для текстового редактора. Я пишу в Sublime + PlainTasks, так же есть похожее расширение для VSCode: Todo+.

                Учтите, что этот файл выглядит очень хорошо только в Sublime + PlainTasks, от markdown здесь никакого форматирования к сожалению не делается.

                Теперь далее можно реализовывать по одному пунктику и сразу видеть результат.

                Я обязательно держу все свои задачи в туду-пунктах. Если бывает так что я выполнил что-то, чего там нет, то я просто заношу это текстом и потом сразу отмечаю как сделанное, за это мой мозг даёт какой-никакой дофамин.

                Ещё у меня есть .todo файлик для каждого проекта, и я все эти файлики храню в одном месте, ибо коммитить его в проект странно; а хранить его в папке проекта и скрывать через .gitignore — плохо, обязательно потеряется.

                У меня даже есть туду-файлы для жизни, для медицины (по каким врачам сходить) и так далее. Очень удобная самоорганизация.

                # 3 Обычный цикл разработки

                Теперь я выполняю туду-пункты и потихоньку коммичу изменения от них. Пока выполняю одни пункты, в голову могут приходить идеи других, и их тоже заношу в туду. Что-то совсем радикальное заношу в файлик ideas.md , чтобы не забыть, но и не заставлять себя реализовывать.

                На таймере чистого времени 21ч 21м и следующий результат:

                Тут уже намного больше фич, и я сам полноценно начал пользоваться программой. Но во время пользования очень много начало болеть и я записал ещё больше туду-пунктов.

                На таймере 33ч 23м чистого времени и я публикую статью про эту програму.

                На моменте 41ч я публикую вторую версию, которая, можно сказать, является финальной версией. Больше от программы мне ничего не нужно, все основные туду-пункты я выполнил.

                Программу можно считать завершённой.

                # 3 Куда девать выполненные туду-пункты

                На данный момент я сделал почти всё, а в файлике с туду-пунктами очень много строк, которые отмечены как выполненные или как отменённые. Когда их становится слишком много, я просто переношу их все вниз в раздел «Архив». Я не удаляю строки, чтобы просто не терять информацию, и просто потому что приятно видеть как много работы я сделал. Конечно, я переношу выполненное вниз не только когда завершаю проект, а когда пунктов становится слишком много, такое периодически происходит в некоторых моих проектах. Посмотреть на текущий туду-файл можно здесь:

                # 2 Время работы над этой программой

                Кстати, если вам интересно сколько времени было потрачено на каждый пункт этой программы, то эта информация находится здесь в файле ниже. Замер времени коммитился одновременно с написанием какой-то фичи, так что дополнительную информацию можно отследить по коммитам и blame.

                информация

                • (во времени не учитывается время на написание статей)
                • время написания первых идей: 20 минут
                • время их ситематизации: 20 минут
                • планирование структур данных, связанных с основной логикой, без учёта интерфейса: 1 час 20 минут
                • планирование структур и методов интерфейса: 32м (2:32)
                • написание кода основной логики: 1 час (3:32)
                • написание кода интерфейса до минимально рабочего состояния: 2ч 45м (6:16)
                • 6ч 16м ————————————————— Минимально рабочее состояние
                • сделал два пункта и распланировал дальнейшие идеи в todo: 45м (7:02)
                • слетел таймер
                • три общих пункта: 47м (0:47)
                • основа статистики: 34м (1:21)
                • рефакторинг окон: 30м (1:51)
                • реализация статистики и других мелких улучшений: 1ч 53м (3:44)
                • раскладка клавиатуры: 1ч 4м (4:48)
                • github-like плитка: 3ч (7:44)
                • написал quad-storage: 1ч 49м (9:33)
                • заставил запускаться в васме, пофиксил баги и небольшие дополнения: 1ч 50м (11:23)
                • скинул таймер
                • написание статьи про программу: 2ч 56м
                • 21ч 21м ————————————————— Средне рабочее состояние
                • закончил править все критичные пункты: 1ч 30м
                • начал таймер
                • сделал чтобы можно было выбирать количество слов: 44 минуты (0:44)
                • сделал чтобы можно было искать по всем словам с fuzzy поиском и это работало при добавлении слова: 1ч 2м (1:46)
                • сделал окно для редактирования одного слова: 53м (2:39)
                • добавил показ контекста данного слова из текста: 46м (3:15)
                • для работы можно выбирать количество новых слов и количество слов для повторения: 21м (3:36)
                • добавил вывод информации о количестве слов в тексте после добавления: 20м (3:56)
                • фича синхронных субтитров: 3ч 26м (7:22)
                • мелкие фичи: 57м (8:19)
                • переход на другой генератор рандома: 10м (8:29)
                • сбросил таймер
                • дописал статью про программу с учётом новых фич и пользования: 2ч 3м
                • 33ч 23м ————————————————— Первый релиз
                • повторение слов после неправильного ввода и инвертирование результатов: 1ч 48м
                • улучшения окна add words: 20м
                • выбор переводов при выборе слов и выбор наиболее задолженных слов: 43м
                • улучшения набора слова: 45м
                • улучшения окна edit word: 30м
                • задание количества повторений в настройках: 11м
                • чтобы текущий день считался правильно с учётом тайм-зоны: 37м
                • переехал на egui_template: 2ч 13м
                • написал про второй релиз: 30м
                • 41ч ————————————————— Второй релиз
                • добавил скачивание статистики в виде файла: 1ч 15м
                • оптимизировал цвета в белой теме: 1ч 2м
                • не смог заставить в вебе работать изменение масштаба: 1ч
                • написание статьи про imgui: 2ч 44м
                • написание статьи про то как пишу программы: 1ч

                # 2 Пример сложной фичи

                В программе была одна очень сложная фича, реализацию которой интересно рассмотреть отдельно. Эта фича синхронных субтитров. Её суть в том чтобы можно было загрузить одновременно русские и английские субтитры, и смотреть их параллельно.

                Когда дело доходит до такой сложной фичи, её надо хорошо продумать.

                Ещё фичу надо не только хорошо продумать, но и додуматься до того чтобы её внесение в программу давалось минимальными усилиями, чтобы пришлось минимально переделать. Изначально я хотел внести эту фичу как часть окна по добавлению слов из субтитров, но понимал что это будет требовать для каждых английских субтитров иметь русские, что плохо вписывалось. Тогда я додумался просто сделать эту фичу как отделное окно, и всё сразу стало красиво.

                Вот результат продумывания в файлике ideas.md :

                синхронные субтитры

                • это будет отдельное окно, которому можно указывать конкретное слово, а оно будет их искать все его встречи в первом предоставленном тексте
                • окно для добавления имеет два поля для ввода текста: Lang 1 (to search words), Lang 2 (translation of Lang 1).
                • у окна для показывания есть метод, который позволяет ввести в поиск нужное слово, если окно открыто. в отличие от окна поиска, это окно не открывается автоматически
                • использует column для окна вставки субтитров
                • использует grid для показывания параллельно. так как там могут быть пустые места с обоих сторон.
                • использует код аналогичным scrolling для выбора элемента скролла
                • перебирает одновременно оба субтитра и смещает указатель текущего времени, если у текущего времени есть пересечение с тем что на другом языке, связывает их в один
                • ещё в окне показывается номер элемента слева, то есть grid состоит из 3 элементов
                • если одна фраза на одном языке пересекается с несколькими на другом языке, то она показывается только для первой
                • есть галочка искать по словам или по вхождениям

                В процессе стало понятно что эта фича больше похожа на олимпиадную задачу, чем на обычный код. Проблема в том, что субтитры не обязаны мне ничего. У меня нет гарантий, что одна реплика идёт за другой, и что в английском и русском фразы обязательно будут иметь одинаковые тайминги. И это надо было учитывать.

                Сначала я планировал алгоритм в случае того что субтитры выглядят хорошо. На картинке ниже время идёт справа-налево, снизу русские субтитры, сверху английские.

                Затем выбрал худший общий вариант и начал планирвоать алгоритм субтитров как на картинке. Всё аналогично предыдущей, только английский и русский язык разделяет волнистая линия. Видно, что тут нарушается гарантия того что в одном файле субтитров все реплики обязаны идти друг за другом.

                Тут очень пригождаются навыки олимпиадного программирования, ибо надо:

                • Рассмотреть крайние случаи.
                • Узнать какие у тебя есть гарантии от входных данных, увидеть подвох.
                • Постараться продумать алгоритм без костылей, чтобы на его реализацию не ушло больше часов, чем длится олимпиада.
                • Чтобы алгоритм работал за приемлемое время.

                Но я решил забить на скорость работы алгоритма, ибо у меня не миллиарды реплик, а максимум тысяча. И я искал каждую подходящую реплику тупо линейным поиском. И на практике никаких замедлений при добавлении синхронных субтитров не наблюдается.

                Так что крайне советую вам прокачаться в олимпиадном программировании на codeforces. LeetCode фигня, ибо он плохо замеряет время работы программы, и вообще задачки там слабые.

                Кстати я использую бумагу только когда надо что-то рисовать или писать математические формулы, в других случаях писать текст на клавиатуре в миллион раз быстрее. Так что лично я советую вам писать идеи и туду-пункты не на бумаге.

                # 2 Про чистое время

                Я замерял время работы и можно увидеть что чистого времени получилось 40 часов, что это значит? Это значит что я бы мог сделать эту программу за рабочую неделю? Нет.

                Моё чистое время замерялось только во время работы, перерывы я не засчитывал. Ещё я работал не по 8 часов в день, а меньше: иногда 2, иногда 4. И самое главное — между этими подходами у меня были большие перерывы в виде отдыха и сна. Так что это может быть причиной почему я так эффективно работал.

                На работе мы работаем с перерывами, итого за 8 часов рабочего дня, из них по-настоящему рабочими получается всегда меньше. Говорят, 4-6.

                Да и даже если захотеть, и каждый день работать по 8 часов идеально, чтобы все эти 8 часов были чистым временем, то так долго не протянешь. Устанешь уже на следующий день. А если не устанешь, то в долговременной перспективе тебя ждёт выгорание и проблемы с психическим здоровьем.

                Так что все эти инициативы по переходу на 4-часовой или 6-часовой рабочий день имеют смысл.

                #На примере фичи для Portal Explorer

                Это пример про то как я внёс непростую фичу в другую програму.

                У меня стояла задача сделать возможность добавить камере переключение между разными точками, чтобы заранее эти точки можно было задать, а пользователь мог между этим выбором переключаться. Это нужно было для предстоящих сцен.

                Эта фича оказалось одной из тех, для которых у меня не было ни малейшего понятия о том как её реализовывать.

                Поэтому сначала я взял и начал расписывать вопросы и ответы на них. Здесь самое главное — продумать как фича встанет в имеющуюся структуру программы. Я рассуждал в форме текста. Когда появилось первое понимание — накидал struct’урки и enum’ы. Наблюдать результат рассуждений и типы можно на скриншоте ниже:

                После этого ещё больше подумал, проработал все непонятные места и разрешил их, в голове сложилась картина, и я решил записать туду-пунктики, которые надо реализовать, чтобы эта фича была полностью сделана — это второй скриншот.

                Теперь, после того как у меня всё чётко и понятно в голове, я мог начать очень эффективно фигачить код,.

                И затем код был благополучно реализован. Конечно, пару штук на планировании я забыл, но без этого никуда.

                #Про пет-проекты

                Немного мыслей про то как делать пет-проекты, кажется что они подходят духу статьи.

                # 2 Поиск аналогов

                Моя программа для изучения слов похожа на другую программу — Anki. Я это узнал только после написания своей программы, поэтому хочу чтобы вы не повторяли моих ошибок.

                Тщательней ищите аналоги, изучайте их досконально, читайте статьи и пользуйтесь. Ведь, как известно, самый лучший проект — это тот, который не пришлось сделать.

                Если бы я удосужился нормально искать программы для изучения слов, а не удовлетвориться неудобством Duolingo и ему подобных, то я бы и не потратил всё это время на написание своей программы, я бы мог написать только отдельный модуль для работы с субтитрами, например.

                Ну или если ваша задача в том чтобы научиться какой-то технологии через пет-проект, то этот совет неприменим, тут писать очередной велосипед — святое дело.

                # 2 Важнее что-то не делать

                Просто процитирую tonsky:

                Многие программисты могут подумать, что ничего не делать — это что-то автоматизировать. Нет, наоборот, автоматизирование добавляет головной боли, а мы хотим ее избежать. Например, мне в прошлом посте про «пассивный код — мертвый код» порекомендовали не мучать пользователя постоянными разлогинами, а завести тестового юзера и автоматизировать:

                «Скрипты. Планировщик в CI запускает тесты, оформленные в pytest/junit/whatever, рисует красивые картинки, срёт уведомлениями, если что-то пошло не так. Надо только определиться, кто отвечает за реакцию на уведомления.»

                Это, конечно, путь для нормальных систем, где программистам платят зарплату, чтобы они не дергались и делали то, что сами добровольно никогда бы делать не захотели.

                Но в пет-проектах, к сожалению, зарплату не платят, поэтому приходится адаптироваться. Что не так с этим предложением?

                Во-первых, очень много работы. Скрипты надо написать, всю эту машинерию — настроить. Во-вторых, очень много мейнтенанса — за CI надо следить, на уведомления реагировать. В-третьих, это все будет ломаться, это надо обслуживать, что явно будет лень делать, т.к. ломается оно всегда не вовремя, а проектом не каждую неделю есть время заниматься.

                Трюк с пет-проектами в том, чтобы обмануть себя и успеть сделать что-то, что можно показать людям до того, как ты устанешь и тебе надоест. А тебе устанет и надоест, trust me. Поэтому количество нерелевантной работы надо резать жестко и беспощадно. И поэтому я так доволен решением с авторизацией: работы нет, а тестирование выполняется.

                Классическая иллюстрация этого принципа это «не пишите движок блога». Потому что устанете быстрее, чем напишете первый пост. Люди, которые хостятся на Github Pages с готовым шаблоном или на WordPress — те, которым интересно решить проблему; люди, которые пишут движок — те, которым интересно попрокрастинировать. Поэтому вы читаете этот текст в Телеграмме, а не на каком-то самописном сайте с собственным компилятором — я бы этот компилятор до сих пор писал.

                Другой пример из недавнего — Roam Research. Чуваки лет то ли пять, то ли семь сидят без сервера вообще, тупо складывают все в Firebase и ничего, работают, денег подняли. Во всей инфраструктуре нет ни одного сервера. Потом пришел создатель Athens Research, решил склонировать Roam, но еще больше не заморачиваться, и не стал делать даже Firebase. Просто сделал локального клиента, так еще и без авторизации обошелся. И все равно 2 ляма поднял. Легенда.

                Все это иллюстрирует один принцип: чем меньше работы вы себе придумаете, тем выше шансы все это закончить. И наоборот, будете делать «по-нормальному», «правильно» — и не закончите никогда. Потому что лето, пиво, дети, диван, друзья или плейстейшн побеждают «отдых программированием» в 100% случаев. Да вообще все что угодно его побеждает. И это нормально, с этим ничего не сделаешь, надо просто придумать, как в таких условиях работать.

                # 2 Прототипирование

                На первых этапах нужно реализовать как можно меньше фич, чтобы видеть результат и был шанс довести проект до конца, иначе вы выгорите, если для того чтобы увидеть первый результат вам потребуется 40ч чистого времени. Затем надо вносить только самые критичные фичи, чтобы снова видеть результат, и понимать что программа в любой момент времени выполняет максимальное число функций, которые вы от неё хотите.

                Ещё крайне важно делать результат быстро и сразу им пользоваться, ибо потребность в некоторых фичах невозможно понять пока не попользуешься.

                Поэтому ImGui здесь отлично заходит для прототипов или пет-проектов. Он ускоряет разработку.

                # 2 Сразу отбрасывать сложные фичи

                Как мне удалось так быстро сделать программу для изучения английских слов?

                Потому что на самом начальном этапе я откинул самые сложные фичи:

                • Иметь встроенный словарь
                • Нормализация слов (убрать -s, -ing, -ed итд.)
                • Retained mode интерфейс

                Благодаря этому я тратил время только на войну с собой. Не воюя с другими библиотеками.

                Такие вещи надо заранее откидывать, иначе ты никогда не закончишь свой проект. Вначале всё должно быть тупо и вручную.

                Если ваш проект предполагает что-то очень сложное, что невозможно выкинуть, то советую подумать о том стоит ли вам браться за этот проект, или прямо сейчас делать что-то попроще.

                #Автоматизация

                Щас хайпятся всякие GitHub Copilot, которые типо пишут код за программистов, и типо бу-бу-бу программистов заменят машины.

                Посмотрите на эту статью ещё раз. Разве такое можно автоматизировать? Это настоящее мышление, которое требуется для программирования даже джуном. Это нельзя автоматизировать до тех пор, пока не будет создан сильный ИИ. А до тех пор Copilot будет только инструментом, который немного упрощает разработку в руках программиста.

                А когда создадут сильный ИИ, то отпадёт смысл в любом человеческом труде на планете Земля, так что нет смысла волноваться конкретно за программистов. Все станем бесполезными вместе.

                #Заключение

                Этот способ не идеален, это скорее сборник идей, чем инструкция к действию каждый раз. Надеюсь эта статья натолкнёт вас на поиск своего способа планировать программы, который увеличит вашу эффективность.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *