Я можу написати код ... але не можу добре розробити дизайн. Будь-які пропозиції? [зачинено]


83

Я відчуваю, що мені добре писати код шматочками та шматочками, але мої дизайни справді смачні. Питання в тому, як я вдосконалюю свої дизайни - і в свою чергу стаю кращим дизайнером?

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

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

Отже, моє запитання - як я вдосконалюю свої дизайнерські навички? Тобто можливість спроектувати невеликі / середні програми, які увійдуть у кілька тисяч рядків коду? Як я можу навчитися дизайнерським навичкам, які допоможуть мені створити кращий набір редакторів html або якусь графічну програму на зразок gimp?


1
"дозволимо визнати той факт, що більшість програм, створених у школі, зазвичай становить приблизно 1000 - 2000 рядків, це означає, що це в основному академічні вправи, які не відображають складності програмного забезпечення в реальному світі": Там, де я навчав, у нас було два семестровий програмний проект, в якому команда з десяти студентів розробила досить складну програму протягом 6 - 8 місяців. Також багато компаній (принаймні в Німеччині) пропонують короткі контракти для студентів, які хочуть пройти певну практику, перш ніж закінчити навчання.
Джорджіо

Відповіді:


87

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

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

  • Визначте хорошого наставника . Немає нічого кращого, ніж вміти поговорити про свої проблеми з тим, хто вже сплатив внесок. Навчання - це чудовий спосіб допомогти швидкому навчанню.
  • Читай , читай ще, практикуй те, що ти читав, і повторюй протягом усього життя своєї кар’єри. Я цим займаюся вже більше 20 років, і я все ще отримую щось, навчаючись щодня нового. Дізнайтеся не тільки про розробку фасаду, а й про нові проекти, тестування, кращі практики, процеси та методики. Всі вони мають різний ступінь впливу на те, як ваші дизайни з’являться, формуватимуться і, що ще важливіше, як вони тривають у часі.
  • Знайдіть час подумати . Або займіться проектом скунктури на робочому місці, або попрактикуйтесь у власний час. Це йде рука об руку з вашим читанням, застосовуючи ваші нові знання та бачачи, як такі речі будуть працювати. Це також те, що дозволяє добре обговорити з наставником.
  • Займіться чимось технічним поза своїм робочим місцем. Це може бути проект чи форум. Щось, що дозволить вам перевірити свої теорії та ідеї поза вашим найближчим колом однолітків, щоб зберегти новий погляд на речі.
  • Будьте терплячі . Визнайте, що досвід отримання заробітку потребує часу, і навчіться приймати, що вам потрібно відмовитися на деякий час, щоб дізнатися, чому і де ви провалилися.
  • Ведіть щоденник чи блог про свої завдання, свої думки, свої невдачі та свої успіхи. Це не обов'язково, але я виявив, що вам може принести велику користь, щоб побачити, як ви розвивались з часом, як зросли ваші навички та змінилися ваші думки. Я повертаюся до власних журналів кожні кілька місяців і переглядаю речі, які писав 4-5 років тому. Це справжній відкривач очей, який виявляє, скільки я навчився за той час. Це також нагадування про те, що я час від часу помилявся. Це здорове нагадування, яке допомагає мені покращитися.

45
+1 для спроби та помилки. Тому що, коли ти не розумієш, чому існує модель дизайну, ти не можеш ефективно використовувати цей шаблон.
Мерт Аккакая

2
+1 чудова відповідь, але я вважаю, що вона дещо неповна. Я вважаю, що найбільш важливим внеском на сьогодні було б мати дуже гарний апетит до рефакторингу. Напишіть, подивіться, що говорить теорія (статті, книги чи наставник), рефактор / перепишіть, поверніться до теорії, рефактор / перепишіть - це дасть вам час зосередитись на структурі, працюючи зі звичним кодом. Будьте своїм найгіршим критиком. Я б також сказав, що дуже важливо, щоб ви ніколи не втрачали цього апетиту, постійно переглядаючи власну роботу.
vski

1
@vski Є багато концепцій, які я міг би включити, але питання полягає в тому, чи самі ці концепції дають розумний шлях до отримання досвіду, необхідного, щоб ОП вважала себе вдосконаленим дизайнером. В рамках своєї відповіді я бачу рефакторинг як практику (відповідно до мого другого пункту). Так само практикується Clean Code, Test First, BDD та багато інших понять. Я застосував підхід до того, що існує багато навичок та досвіду, необхідних для того, щоб розвинутись до того моменту, коли з часом із завоюваним досвідом та знаннями розвиватимуться та розвиватимуться навички дизайну. :)
S.Robins

2
+1 для отримання наставника. В ідеалі запропонуйте своєму наставнику робити з вами огляди коду. Якщо хтось ще читає та критикує ваш код, це дійсно може допомогти вам у питаннях кращого та більш чіткого дизайну.
Лев

2
"Коли-небудь намагався. Колись не вдалося. Неважливо. Спробуйте ще раз. Повторіть помилку. Не вдається краще". --- Семюел Беккет.
Пітер К.

16

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

Ви могли прочитати книги з цього приводу. Чудові книги. Фантастичні книги. Але я вважаю, що ці книги допомагають вам лише після того, як ви спробували створити та створити додаток - і не вдалося.

Для мене все стосується досвіду. Коли я починав як новачок, я читав книги про те, як конструювати. Тоді я багато чого не розумів. Коли я почав працювати і мав сам розробляти додатки, я робив дуже безладні програми. Вони працювали, але їх боліло підтримувати. Потім я знову прочитав ці книги - і цього разу я краще їх зрозумів.

Зараз я продовжую робити нові помилки та вчитися на старих.


10
Тут є чудовий момент, на який варто звернути увагу: продовжуйте робити нові помилки; не продовжуйте робити ті самі старі помилки - вчіться на них і робіть щось нове.
Беван

11

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


2
Екстрений дизайн - прекрасна річ ІМХО, але без дисципліни ви ризикуєте створити "спагеті, що виникають". Проблема з передньою конструкцією полягає в тому, що люди сприймають це як все або нічого, і це дає погану відповідь, коли справи йдуть погано. Це нагадує мені одну із статей Джоела, де він згадує, що дизайн важливий. Те, що потрібно, хоч достатньо передньої частини для дизайну, щоб змінити значення, не позбавляючи вас часу, ресурсів та вашого шансу побачити, як красиві несучі конструкції з'являються органічно через чистий код.
Робінз

@ S.Robins: Я вважав, що ОП все ще атакує проекти, які є досить маленькими, щоб дуже добре виконати TDD та постійний рефакторинг. Таким чином, він може навчитися дисципліні, необхідній, щоб знати, скільки дизайну потрібно для складніших проектів.
Кевін Клайн

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

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

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

7

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

Наприклад, див. Http://sourcemaking.com/antipatterns/software-development-antipatterns .

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

Будьте дуже скептично налаштовані на додавання "ще одного маленького хака". Ще один тут, ще один там, і код стає некерованим.

Цінуйте відкритий / закритий принцип .

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

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


4

Один із принципів, який я вважаю дуже важливим для гарного дизайну, - це декомпозиція: якщо клас занадто великий (більше, ніж, скажімо, 300-400 рядків коду), розбийте його на менші класи; якщо метод занадто великий (скажімо, більше 50 рядків коду), розкладіть його; якщо проект містить більше 50 класів, розкладіть його.

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


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

1
@jer: Звичайно, це правило. Як ви говорите, метод, що викликає 100 інших методів, - це просто зшивання речей (це виклик списку підфункцій). Я більше замислююся над методами, які містять якусь реальну логіку: це звичайно поганий знак, якщо вам доведеться багато прокручувати назад і вперед, щоб зрозуміти, що робить метод. Те саме, якщо подивитися на визначення класу з великою кількістю членів (і клас - це не просто велика плоска колекція властивостей).
Джорджіо

"проект містить більше 50 класів, розкладаємо його" несерйозно
динамічний

@ yes123: Це мало на меті дати ідею. Це дійсно залежить від того, що ти розвиваєш, якою мовою тощо
Джорджіо

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

0

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

"Краще"

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

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

І "Happier"

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


-1

З мого особистого досвіду читання інших кодів є хорошим джерелом "натхнення". Я маю на увазі спробувати зрозуміти дизайн інших людей і запитати себе, чому він / вона робить так?

ви можете знайти багато проектів з відкритим кодом для досліджень.

все одно потрібна практика.


-1

Не живи в страху

Прагніть до простоти

Слухайте своїх користувачів

Спробуйте багато ідей

Створіть щось, а потім зробіть це краще

Працюйте над речами, що додають вартість, відмовтесь від речей, які не мають


-1

Навчіться ставити правильні запитання. Частіше за все ви вдосконалите дизайн, дивлячись на проблему з іншого кута. Зокрема, це допоможе вам відійти від зосередження уваги на вирішенні проблеми та вивчити більше шляхів вирішення кількох пов'язаних із цим проблем.

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