Як професійні команди з розробки програмного забезпечення вирішують складність дизайну в нетривіальних проектах?


9

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

Я займаюся програмуванням таким чи іншим способом ще з 11 років. Це означає, що я здебільшого навчаю себе все з самого початку. Я отримав технічну освіту, але не суворо з комп’ютерних наук (я закінчив ступінь за спеціальністю "Фотонна інженерія"). У нас, звичайно, були курси програмування, але це були в основному для мене речі, і я не навчився багато нового. Я продовжував навчати себе на радість від цього і завжди знав, що буду продовжувати кар’єру в галузі програмування, але всі мої проекти були на той час зовсім маленькими. Я не мав проблем утримувати їх у думці та підтримувати їх.

Тепер я вважаю себе лідером у команді, але не в корпоративному середовищі - працюю в університеті, розробляючи наукове програмне забезпечення (в С ++) для інженерних застосувань. Раптом проект стає (відносно) великим, і я маю проблеми з обгортанням своєї думки навколо нього більшу частину часу. Я втрачаю багато часу і сил на дві речі:

  1. Коли мені доводиться повертатися до розділу коду, над яким я не працював деякий час, мені важко згадати, як він працював. Я витрачаю багато часу на перегляд файлів заголовків для відповідних класів та читання коментарів, які я розміщував попутно у вихідних файлах. Мені б хотілося, щоб була якась форма «схематичної», яку я міг би легше побачити і відновити картину;
  2. Коли я ввожу зміни, іноді я усвідомлюю, що те, що я намагаюся зробити, порушить десь інше (або ще гірше, воно з’являється лише під час виконання, як несподіванка). Я повертаюся і починаю робити це по-іншому, лише щоб дізнатися, що я знехтував впливом на якийсь інший компонент. Мені б хотілося, щоб була якась "діаграма архітектури", де я міг би бачити, як все робиться, як те, що я намагаюся зробити, впливатиме на інші компоненти та спосіб детально планувати, перш ніж розпочати впровадження змін.

Більшість людей, з якими я працюю, мають подібні історії, як і мої власні - сильна технічна спрямованість та інколи чудові навички, але ніякого способу організації їх роботи. Однак їхні проекти зазвичай набагато менші, ніж мої, тому вони якось справляються. У будь-якому разі, що для мене це означає, що я самостійно і у мене немає від кого вивчити хороші практики.

Я взяв аспірантуру з управління ІТ, і хоча мені здається, що це цілком задовольняє, він переважно орієнтований на непрограмістів, викладає про методології управління проектами, оцінки бюджету / розкладу, архітектури підприємства тощо - не дизайн програмного забезпечення та планування як таке. Це добре, я намагаюся навчитися також цього. Звичайно, були введені деякі інструменти (на зразок UML) та типи процесів розробки програмного забезпечення (каскад, ітеративний, спритний ...), але, очевидно, не дуже детально, і я важко вирішую, що мені вибрати та використовувати ( і в якій мірі).

Я читав багато запитань та відповідей щодо розробки програмного забезпечення на SO - є багато про те, як це зробити за допомогою того чи іншого конкретного інструменту чи методології, і якби я був впевнений, що документація UML вирішить мої проблеми - я підберу її та почати його використовувати. Але деякі присягаються, інші кажуть, що це марно. Я шукаю відповідь на більш високий рівень абстракції - чи є способи вирішити дві проблеми, які у мене є, і як ви особисто це робите? Що я повинен навчитися робити це, можливо, не прив'язуючись до якогось конкретного інструменту? Час від часу вони виходять із стилю, і я очікую, що їх застосовність змінюється залежно від типу проекту.

Велике спасибі за прочитане, я не зміг сказати, що я маю на увазі коротше (бракує досвіду розробки програмного забезпечення та словника).


2
Я думаю, що найпоширеніша професійна відповідь на труднощі, про які ти говориш, - це "ебать це", а потім - звинувачення в управлінні, продукті чи іншому випадковому SOB.
Едвард Странд

Відповіді:


9

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

Уявіть, як почуватиметься бідний хлопець, який приходить після вас - він навіть не має переваги колись дізнатися, як працює ваш код. Замість того, щоб намагатися розшифрувати код, слід переглянути документацію, яку ви написали для відповідного модуля. Ця документація повинна пропонувати досить точний вигляд того, що робить модуль чому. Це не "модуль починається з ініціалізації трьох масивів, використовуючи трійку для циклу ...", а замість цього: "цей модуль витягує дані, зібрані головним датчиком Fabulotron, переставляє їх у стандартний неополітанський (шоколад, ваніль, полуниця) формат, і доставляє його до модуля аналізу. "

У ідеальному світі у вас є проект проекту, який визначає різні модулі в системі та описує їх відповідні обов'язки, і кожен з ваших модулів може просто звернутися до цього документа, щоб пояснити, що вони роблять: "Цей модуль надає Служба збору даних Fabulotron, як це детально описано в розділі 4.8 проекту проекту: http://fabulotron.org/design/section4-8.html . " Якщо у вас немає чогось подібного, почніть записувати огляд кожного модуля під час роботи над ним. Вам не потрібно писати книгу - кілька абзаців часто досить, щоб орієнтуватися.

Коли я ввожу зміни, іноді я усвідомлюю, що те, що я намагаюся зробити, порушить десь інше (або ще гірше, воно з’являється лише під час виконання, як несподіванка). Я повертаюся і починаю робити це по-іншому, лише щоб дізнатися, що я знехтував впливом на якийсь інший компонент.

Це може бути свідченням того, що ваші модулі занадто взаємопов'язані. Чим більше незалежних ви можете зробити свої модулі / класи / одиниці, тим менше ймовірність, що ви зіткнетеся з подібною проблемою. Постарайтеся зробити інтерфейси між модулями максимально явними і намагайтеся обмежити їх лише тим, що там має бути. Інтерфейс - це договір - якщо ви знаєте, що якийсь модуль виконує свої зобов'язання, визначені в інтерфейсі, вам більше нічого про це не потрібно знати. Це запобігає впливу змін на модулі, над яким ви працюєте, на інші модулі.

Мені б хотілося, щоб була якась "діаграма архітектури", де я міг би бачити, як все робиться

Використання стандартних деталей може допомогти в цьому відношенні. C ++ надає стандартні частини у вигляді бібліотеки стандартних шаблонів, а використання тих частин, де це можливо, дозволяє працювати на більш високому рівні абстракції. Якщо ви написали власний код для управління структурами даних, такими як списки, вам і тим, хто слідує за вами, доведеться постійно читати джерело, щоб з’ясувати, що відбувається. Якщо ви замість цього використовуєте стандартні деталі, надані STL, будь-який програміст на C ++ швидко зможе сказати, що робить ваш код, не заглиблюючись у свої процедури управління даними.

Інший різновид стандартної частини походить від моделей дизайну. Вони є стандартними поняттями, які можна використовувати як скорочення, щоб пояснити, як працює взаємозв'язок між двома об'єктами.


Дякую за відповідь. Звичайно, я використовую STL протягом багатьох років, але послідовність кроків, які виконує моя програма, щоб виконати якийсь надуманий розрахунок, іноді важко уявити в повному обсязі навіть при його використанні. Те саме стосується модулів. Я не мав на увазі зміна одного перелому іншого, а скоріше, що зміна чогось десь спричиняє збої, наприклад, коли користувач робить щось нестандартне в графічному інтерфейсі, де складна послідовність ще більше ускладнюється непередбачуваним порядком кроків, які вони виконують для його завершення.
neuviemeporte

5

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

Однією з перших речей, які мені довелося зробити, було сісти і прочитати чистий код . Це фантастична книга, яка допомогла мені зрозуміти, як написати код, який я міг зрозуміти, коли я повернувся до нього або що хтось інший міг зрозуміти.

Друга річ полягала в тому, щоб написати тести хорошої якості, Unit, Integration, Acceptance. Якщо ваш код добре перевірений, ви швидко дізнаєтесь, коли щось зламали, і швидко зможете діагностувати проблему. В Інтернеті є багато хороших ресурсів для тестування, і я не впевнений, які найкраще запропонувати вам.

Мої ключові моменти - тестування та чистий код.


Дякую за пропозицію, я обов'язково перевіряю книгу (навіть незважаючи на те, що "спритний" у підзаголовку, схоже, вказує на те, що це стосується переважно цієї методології). У мене є тести і, прочитавши багато книг стилів кодування (наприклад, Прагматичний програміст), я завжди прагну створити чисті та добре розділені інтерфейси, але одне автоматизоване тестування є складним для частини графічного інтерфейсу моєї програми, і у мене ще немає спосіб зробити гарний загальний дизайн у більшому масштабі, що виходить за рамки впровадження «чистих» практик щодо відносно невеликих шматочків коду.
neuviemeporte

2

Ось кілька ідей на високому рівні для організації великих програмних систем. Більшість мого досвіду є в Інтернет-системах, але я думаю, що ці ідеї стосуються інженерного програмного забезпечення.

  • Відокремлений функціонал на відносно ізольовані модульні блоки. Наприклад, у вас може бути модуль для кожної групи розрахунків, яке надає ваше програмне забезпечення.
  • Застосуйте шаблон дизайну MVC для інтерфейсу користувача, якщо він є. Нехай інтерфейс та модель будуть розділені чітко визначеними межами.
  • Подумайте про використання шарів для групування модулів. У додатку, який використовує шари абстракції, кожен шар залежить лише від шару під ним.
  • При написанні документації припустімо, що ви забудете всі деталі реалізації. Ви будете писати багато документації під цим припущенням - можливо, стільки ж половини вашого коду буде коментарями, але згодом ви будете набагато менше плутати.
  • Автоматизований тест на інтеграцію, інтеграцію та прийняття є чудовим у деяких просторах, але, здається, розробники C ++ мають неоднозначні почуття щодо них.
  • Малюємо сильно на дизайнерських моделях . Окрім загальнодобраних ідей, моделі дизайну містять загальну лексику в інженерії програмного забезпечення. Виклик класу WidgetFactory - це стислий спосіб повідомляти, що це клас, який існує для створення віджетів.

З давніх пір я працював із інженерним програмним забезпеченням, тому ваш пробіг може залежати від цих пропозицій. Удачі!


1

Відповідь - інженерія програмного забезпечення.

Тобто для великих проектів ви дотримуєтесь встановленої послідовності збору вимог, визначення процесу, специфікації тощо задовго до того, як буде зроблено фактичне кодування.

Існують різні методології, що застосовуються залежно від середовища та культури. Бізнес типу підприємства, як правило, слідкує за " Раціональним єдиним процесом " або подібним. Технологічні стартапи, як правило, змінюються на Agile , урядові відомства і деякі перевантажені методології водоспаду .

У всіх випадках процес допомагає вам точно визначити, що ви робите, і до кінця проекту дає змогу довести, що ви це зробили.


Якщо припустити, що вимоги не змінюються (я знаю, нереальне припущення в багатьох випадках), чи можливо насправді все задати перед кодуванням, а потім створити робоче програмне забезпечення з специфікації без великих змін на цьому шляху? Я просто не можу це уявити. Мені потрібно почати кодування, щоб зрозуміти.
тріпати

Це може працювати для малих проектів, але для великих проектів потрібно спочатку впоратися з вимогами. Також важливою частиною RUP є моделювання запропонованої системи з діаграмами UML та послідовності. Набагато простіше налаштувати та переробляти модель, ніж фактичний код.
Джеймс Андерсон

@neuviemeporte: Це залежить. Іноді вимоги змінюються або під час розробки виявляються нові вимоги. Іноді вимоги досить зрозумілі з самого початку, і лише деякі незначні деталі будуть змінюватися під час розвитку, але загальна архітектура залишиться такою ж.
Джорджіо

1

Я настійно рекомендую взяти участь у Enterprise Architect , який, хоча і не є безкоштовним, пропонує академічні ціни. Це відмінний інструмент для діаграми проектів як на макро-, так і на мікрорівні. Він також може переробити інженеру вихідних файлів на діаграми класів, що, мабуть, стане хорошим початком для документування та реорганізації того, як ваша програма працює разом.

Я б також другий @ Клі рекомендації. Не відкладайте нібито "спритних" інструментів, оскільки вони справді просто найкращі предмети, які також зручні (якщо не обов'язкові), якщо ви дотримуєтеся спритного процесу. Але безперервна інтеграція (наприклад) цінна незалежно від вашої методології. Більше того, одиничні тести (cppUnit?) - ваші друзі. Тестові одиниці повинні бути дуже допустимими, якщо ви перевіряєте класи логіки, які викликаються вашим інтерфейсом, а не безпосередньо тестувати інтерфейс користувача. Також є інструменти, які допоможуть вам автоматизувати тестування інтерфейсу користувача, але я спробую спочатку зібрати задні матеріали.

Удачі!


1

Я вважаю, що ваша проблема має три виміри

  1. Орієнтований на програму
  2. Програмно-орієнтована
  3. Технічне обслуговування програми - орієнтоване

Щодо першої проблеми, у вас можуть бути програмісти, які не розуміють поняття, що робить програма (це часто трапляється в корпоративних налаштуваннях). Але, переходячи до вашого питання та домену, в якому ви перебуваєте, здається, що ви та ваша команда контролюєте те, чим займається програма, але просто не можете швидко перевести її у робочу програму (наводячи приклад, я чув про людей маючи післядипломну ступінь доктора фізики, маючи проблеми з розумінням покажчиків програмування, і я впевнений, що фізика набагато складніше, ніж C ++). Якщо це так, то ваша проблема здебільшого орієнтована на програму (Ви повинні відчувати себе щасливим, що люди навколо вас можуть зрозуміти, що робить ваша програма, і можуть оцінити це).

У випадку проблем, орієнтованих на програму, однією з моїх обурливих пропозицій було б перейти на більш високий рівень абстрагування, ніж C ++, наприклад, вивчення нової мови як Python або Haskell (Python досить легко вивчити, і якщо у вас є хороші математики, Haskell просто чудовий). Перехід на більш високий рівень абстракції дозволить зменшити розмір коду, його легко зрозуміти та підтримувати в довгостроковій перспективі, а ефект зміниться швидко. Таким чином, ви можете мати 10 рядків коду замість початкових 50 рядків коду. Крім того, мати когось, хто має досвід роботи в комп'ютерному програмуванні, безумовно, допоможе. Будучи в університеті, ви також можете взяти на себе кілька студентів у графічному інтерфейсі та інтерфейсах, щоб ви могли більше зосередитись на функціональності. Я також рекомендую книгу « Розробка програмного забезпечення великого масштабу C ++» Джона Лакоса(Це досить велика книга, ви можете стати досвідченим програмістом Python за час, який вам знадобиться для читання книги)

Якщо ви вирішите з двох перших вимірів вашої проблеми, третій автоматично вирішується. Оскільки я вважаю, що ви працюєте над одним великим проектом, будь-яке гідне програмне забезпечення для управління проектом ви переживаєте. Попереднє планування необхідне. Якщо ви почнете кодування відразу, ви можете занадто сильно включитися в програму, щоб ви забули велику картину. Маючи на увазі, це не допоможе для великого проекту. Покладіть все в папір (або в комп’ютер). Використовуйте вікі для обміну інформацією. Щодо методологій, я віддаю перевагу гнучкої методології (просто, agile - це стильна назва для інкрементальної розробки програмного забезпечення). Я також пропоную найняти когось, хто має досвід у цій галузі, щоб він подбав про них, щоб ви могли сконцентруватися на своїй основній програмі. Суть у тому, що всі методології управління проектами - це лише спосіб забезпечити успіх програми; тож ви можете вибрати когось, що підходить вам та вашій команді, замість того, щоб вибрати щось, що хтось рекомендує найкраще. Також наступне програмне забезпечення також може вам допомогти

  • Безкоштовно Mind - Mind mapping software
  • Trac - Швидка та проста програма програмного забезпечення та вікі
  • MoinMoin - Швидкий вікі, щоб дозволити обмін знаннями про програму

Хоча вищенаведені поради потребують певної кривої навчання, що це варто з часом. І нарешті, програмування простіше, ніж Photonic Engineering (хоча не програмування на C ++)


0

Як і ваше запитання, будь-яка корисна для вас відповідь буде дуже довгою і невиразною - але коротка відповідь - "Software Engineering"

Я пропоную вам звільнити трохи вільного часу, наскільки це можливо, якщо ви серйозно ставитесь до кар’єри з розробки програмного забезпечення, і почніть з відвідування сайту Стіва МакКоннеллса . Програмування просте і його можна викладати в семестрі, інженерія програмного забезпечення - на порядок складніша і потребує набагато довшого навчання.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.