Какой рабочий процесс вы используете для разработки программного обеспечения, которое собираетесь писать?
Я начал работать над довольно сложным программным обеспечением. Это для личного проекта, но, тем не менее, я прилагаю немало усилий. Теперь я привык работать над решениями / проектами других людей или над проектами, которые растут очень контролируемым образом.
На этот раз я дважды начал кодировать основы и быстро застрял. Поэтому я отдохнул и решил написать полное решение, прежде чем написать одну строку. Что я сделал (по порядку):
- написание сценариев использования в виде команд консоли (это приложение командной строки)
- напиши какую-нибудь помощь
- проектировать классы, структуру файлов данных и функциональный рабочий процесс для различных частей.
Теперь я иду очень медленно во всей этой части. Я создал личную вики и использую ее для написания этих спецификаций, но я явно чувствую недостаток опыта и четкой методологии.
Я знаю, что разработка программного обеспечения - очень сложная тема, и о ней написано множество книг, но я бы хотел, чтобы вы поделились своим опытом / советами / методологией.
Что вы указываете при работе над личными проектами среднего размера, прежде чем приступить к написанию кода? Как?
заранее спасибо
6 ответов
Что вы указываете при работе над личными проектами среднего размера, прежде чем приступить к написанию кода?
Я уточняю функциональную спецификацию:
- Я боялся, что было бы слишком легко, если бы я только начал кодировать (что "как"), забыть "почему" и "что" я хотел бы написать (для "довольно сложного" программного обеспечения, в течение месяцев или лет, что это может занять развитие).
- Я также хотел более или менее понять "сферу" того, что я буду разрабатывать: для того, чтобы приблизительно оценить (на порядок):
- Насколько большой это будет
- Могу ли я закончить это
- Стоило ли начинать
- Какое его подмножество может быть разработано первым
Ради управления рисками добавлю, что кое-что из того, что я хотел разработать, подразумевало использование некоторого программного обеспечения, с которым я не был знаком; Чтобы свести к минимуму риск, связанный с этим, я также сделал небольшое одноразовое прототипирование.
Как?
Я изложил функциональную спецификацию, используя перо и бумагу. Некоторые из того, что я написал, были высокоуровневыми (документ "бизнес-уровня"), а некоторые низкоуровневыми, больше похожими на дизайн (некоторые детали пользовательского интерфейса). Иногда я останавливался и ломал голову над тем, как это организовать, но потом продолжал, рассуждая, что каждая страница более или менее согласована по каждой теме, и что позже я могу ломать голову над тем, как организовать страницы (во многом как ваша вики, возможно,).
Я и сделал и не уточнил архитектуру программного обеспечения заранее:
- Я начинаю разработку с базовой архитектуры (несколько небольших компонентов), а затем добавляю код; и, когда я добавляю код, если какой-либо компонент становится слишком большим и сложным, я делю его на несколько более мелких компонентов... это эволюционный процесс... как говорится в Systemantics, КОМПЛЕКСНАЯ СИСТЕМА, КОТОРАЯ РАБОТАЕТ, ОБЯЗАТЕЛЬНО НАЙДЕНА РАЗВИТА Из простой системы, которая работала.
- Я не документирую архитектуру; или, скорее, единственной документацией архитектуры является сам код: например, способ, которым исходный код организован в исходные каталоги, пространства имен и библиотеки DLL.
У меня есть теоретическое обоснование архитектуры, как сейчас, но я не задокументировал эти причины:
- Я единственный разработчик
- Фактическая архитектура документируется кодом
- Причины архитектуры находятся в моей голове, и их можно обнаружить с помощью таких вещей, как соглашения об именах в исходном коде и зависимости различных компонентов
Если (только если) я не был единственным разработчиком, то я мог бы подумать, что стоит документировать архитектуру и ее обоснование.
То, что я сказал выше об архитектуре программного обеспечения, верно и для данных, которые обрабатывает программное обеспечение.
Что касается тестирования, я немного кодирую, а затем проверяю его; или написать тест, а затем кодировать функциональность, которая пройдет этот тест. Я не занимаюсь "интеграцией большого взрыва", то есть месяцами написания без какого-либо тестирования.
Одним из самых больших недостатков (или чего-то не хватает) моего процесса является предварительная оценка усилий, а затем отслеживание реализации по сравнению с оценкой... в этом одно из различий между этим "личным" процессом проекта и платным проектом, который я ". буду делать для кого-то еще в коммерческих целях. Я сомневаюсь, что это хорошо: если оценка является наилучшей практикой с коммерческой точки зрения, то, возможно, я "должен" сделать это тоже в личном проекте.
Есть много людей с большим опытом, чем я, чтобы помочь вам со спецификой здесь, но у меня есть один момент, который я думаю, всегда стоит иметь в виду.
Вам не нужно делать это на 100% идеально с первого раза. На самом деле, если вы к этому стремитесь, вы, вероятно, никогда не закончите. Реальность такова, что вы не поймете дизайн полностью, пока не построите систему один раз.
Просто начните, продолжайте двигаться вперед, следите за охватом модульных тестов, и, как вы понимаете, систему и ее тонкости лучше, чем пошаговое рефакторинг для его улучшения.
В основном экраны. Они являются интерфейсом между пользователем и программным обеспечением. Поэтому я пытаюсь определить каждый вариант использования (пользователь будет искать мой продукт - пользователь добавит продукт в свой кэдди, а пользователь проверит его), и я создаю цепочку экранов для каждого из них.
С наилучшими пожеланиями.
- Напишите варианты использования, как вы сделали.
- Выберите 1 вариант использования и полностью его внедрите, и больше ничего не реализуйте. Это включает в себя юнит-тесты, помощь и обработку ошибок - все. Назовите эту версию 1.
- Реализуйте следующий вариант использования. Это может быть просто добавление кода, или может потребоваться полный редизайн. Все в порядке, вы знаете, что делаете сейчас. Сделайте новый выпуск.
- Повторите шаг 3.
Я нахожу чистый лист бумаги, и ручка - лучшая отправная точка:
- набросать несколько грубых диаграмм
- записать некоторые идеи / заметки
- написать псевдокод
- продумать основные варианты использования
- думать о потенциальных проблемах
Не тратьте на это больше получаса и не увлекайтесь слишком большой документацией или предварительным дизайном. Начните кодировать, как только у вас появится смутное представление о том, как вы хотите это сделать. Продолжая разработку, вы почувствуете, достаточно ли хороший код или нет. Если вы недовольны, подумайте о том, что вам не нравится, и начните все заново с учетом этих уроков. Рефакторинг часто и скоро, чем раньше, тем лучше. Если что-то не "чувствует себя хорошо", вероятно, это не так.
- Рисовать экраны
- Нарисуйте отношения данных (RDBMS или в памяти)
- Начать кодирование
- Вспенить, промыть, повторить (или в программаторе GOTO 1)
Я бы начал с минимальной реализации и добавил бы больше функций в каждой итерации.