|
0 / 0 / 0
Регистрация: 12.05.2016
Сообщений: 46
|
|
Конструирование программного обеспечения13.05.2016, 04:53. Показов 2997. Ответов 39
Метки нет (Все метки)
Вместе с языком программирования хотел бы узнать как грамотно строить программы.
Есть ли книжки на эту тему,чтобы было как можно подробно описано как писать хороший код и строить ПО. Думаю немножко поучу С буду писать на нём(на сколько я понял,там программы состоят из функций - что- нибудь на эту тему) Дальше думаю познакомиться с Java(насколько я понял там ООП - тоже подкиньте что-нибудь на эту тему). Если не прав поправьте. P..S. В интернете поискал там пишут про совершенный код, чистый код, вот хотел узнать ваше мнение Заранее спасибо!)
0
|
|
| 13.05.2016, 04:53 | |
|
Ответы с готовыми решениями:
39
Архитектура программного обеспечения Литература по тестированию программного обеспечения инвестиционный проект программного обеспечения |
|
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
|
|||
| 17.05.2016, 00:54 | |||
|
нежели наоборот. идя от низкого к высокому - все узнаваемо. есть понимание, что на самом деле под капотом у компиляторов. тот, кто когда то начинал с ассемблера, не задавал тупых вопросов аля: "я не понимаю указатели". а вот идя от высокого к низкому приходится сталкиваться с новым для себя. программист с++ без подготовки может бегло читать код c# или java. для него нет ничего нового в этих языках. программисту java при переходе на плюсы придется изучить множество нюансов: "блин, столько головняков. вот у нас все было оч просто". а всего то - ручная работа с памятью. в случая с функциональными языками добавляется ещё одна преграда - парадигма. парадигма языка оттачивает мышление. человек привык мыслить функциональной (ну или процедурной) парадигмой. что бы перестроится на другую, ему приходится менять мышление. вам легко дадутся новые знания. вам ничего не придется менять в своих представлениях. но если вы ничего не знаете ни об указателях, ни об адресной арифметике, то после какого нибудь питона, на сишечке вам придется начинать свой пусть с нуля. с деццкого садика под названием "базовый курс".
1
|
|||
|
Модератор
3134 / 2281 / 469
Регистрация: 26.03.2015
Сообщений: 8,878
|
||
| 17.05.2016, 01:11 | ||
|
0
|
||
|
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
|
||
| 17.05.2016, 01:18 | ||
|
чем сначала питон, а затем си. потому что человек при движении от низкого к высокому не будет нести пенальти на переобучение.
0
|
||
|
Модератор
3134 / 2281 / 469
Регистрация: 26.03.2015
Сообщений: 8,878
|
|||
| 17.05.2016, 01:30 | |||
|
Добавлено через 7 минут Если взять хорошо написанную программу на Питоне и как можно ближе к тексту перевести её на Си, то получится хорошая программа на Си. Если взять хорошо написанную программу на Си и как можно ближе к тексту перевести её на Питон, то получится очень плохая программа на Питоне.
0
|
|||
|
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
|
||||
| 17.05.2016, 01:36 | ||||
|
не проще. для этого нужно будет объяснить что такое "процедурная парадигма", со всеми вытекающими. сишнику так же придется менять мышление. Добавлено через 2 минуты переобучаться придется при движении от высокого к низкому. питон вам в этом не поможет.
0
|
||||
|
Модератор
3134 / 2281 / 469
Регистрация: 26.03.2015
Сообщений: 8,878
|
|||
| 17.05.2016, 01:56 | |||
|
изучению си питон не поможет, зато поможет написанию программ на си а вот написанию программ на питоне, привычка писать "в си стиле" только помешает... нужно будет её ломать (в предыдущем сообщении опечатался я в вопросе)
0
|
|||
|
14138 / 9366 / 1350
Регистрация: 21.01.2016
Сообщений: 35,219
|
|
| 17.05.2016, 05:33 | |
|
Shamil1, ТС прямо сказала в одном из своих постов, что хотел бы познакомиться с "подкапотной" работой компьютера. Так, что тут не то, что функциональные, тут и ОО-то языки ему не помогут. Лучше бы, конечно, ассемблер, но и Си сойдёт.
Монады это, конечно, хорошо, но без чёткого представления о таких вещах как стёк, куча, процессорный кеш и т.д, ТС нормальные программы писать не сможет. Я это не просто так говорю, я это каждый день на работе вижу, глядя в C#-код коллег в институте лабораторки по Си покупавших. Функциональный язык это либо следующий этап после ООП (в чём я не уверен), либо альтернативная ветка, но, в любом случае, это куча абстракций, которыми не получится нормально пользоваться, не имея представления об фундаментальных основах работы ПК. И ещё, много ты программ видел написанных на Хаскел или F#? А на Си? И это не просто так. Я ввязался в спор потому, что считаю совет по изучению Хаскела, как первого языка программирования, вредным советом. Ты тоже в школе начинал знакомство с математикой с интегральных уравнений? Всё должно идти по возрастающей - от простого к сложному, от низкоуровневого к абстрактному, а не наоборот. В конце-концов, ТС может остановиться на изучении низкоуровневых вопросов - узнать как работают DLL-ки, разобраться в понятиях адресных пространств процессов, прерывания, и т.д, да и забросить это дело. Станет "очень продвинутым пользователем" и на этом успокоится. А вот функциональные языки ему в этом вообще никак не помогут.
0
|
|
|
Модератор
3134 / 2281 / 469
Регистрация: 26.03.2015
Сообщений: 8,878
|
||||
| 17.05.2016, 10:09 | ||||
|
Сколько строк текста (без воды) можно написать про эти понятия без привязки к конкретному ЯП? В любом серьёзном учебнике по любому языку объясняется, что такое стек и куча. Даже в книжках по VB 6.0 писали, как хранятся переменные в памяти (например, на сколько адрес массива отличается от адреса первого элемента). Кликните здесь для просмотра всего текста
Вот, например, цитата из одного учебника по Haskell.
Вы сейчас меня пытаетесь убедить, что без знания грамматики нельзя писать хорошие книги, и если кто решил стать писателем, ему нужно сконцентрироваться на учебниках по грамматике. Я же пытаюсь возразить, что грамматика, конечно, важна, но выучить её не так сложно и это можно отложить. А сконцентрироваться нужно на привитии себе художественного вкуса и т.п. Нужно много читать классиков, и пробовать писать самому. Причём, писать лучше рассказы, хоть это и сложнее, чем писать романы. Добавлено через 20 минут Программ на Хаскеле существенно меньше, чем на Си. Программа на императивном языке описывает, как нужно сделать. Программа на декларативном языке описывает, что нужно сделать. Пока компьютеры были маленькими и глупыми, проще было объяснять им, как нужно делать. Теперь уже можно оставить эти низкоуровневые детали компьютеру. Но в ИТ сила инерции очень велика. В некоторых крупнейших банках до сих пор большинство используемого кода написано на RPG II. Я не предлагаю писать на Хаскеле. Я считаю, что программист должен знать хорошо как минимум три языка - функциональный, объектно ориентированный и (относительно) низкоуровневый. Например, F#, C# и С. Или Haskell, C++ и С. И начинать учить предпочтительно именно в таком порядке.
0
|
||||
|
14138 / 9366 / 1350
Регистрация: 21.01.2016
Сообщений: 35,219
|
|||
| 17.05.2016, 11:51 | |||
|
Толи мы друг друга не понимаем, толи спорим о разном.
0
|
|||
|
Модератор
3134 / 2281 / 469
Регистрация: 26.03.2015
Сообщений: 8,878
|
|||
| 17.05.2016, 14:02 | |||
|
Добавлено через 1 час 46 минут Для меня программирование - это в первую очередь умение писать программы в принципе, а умение пользоваться каким-то конкретным инструментом. Указатели - это всего лишь инструмент. Причём, пользуемся мы им не от хорошей жизни, а из-за низкого текущего уровня развития ПО и железа. Чтобы быть кузнецом, нужно уметь работать с металлом (понимать принципы работы с металлом) и обладать большой физической силой (чтобы махать молотом). С моей точки зрения, кузнец в первую очередь должен уметь работать с металлом, а что касается физической силы - если будет нехватать - подкачаешься. Тем более, что с учётом новых технологий (более высокие температуры и т.п.) молот уже не должен быть таким тяжёлым, как раньше. А через какое-то время вообще изобретут какого-нибудь робота, который за тебя будет молотом махать, а кузнец будет только показывать, куда и с какой силой бить. И тогда кузнецом сможет стать любой задохлик.
0
|
|||
|
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
|
||||||
| 17.05.2016, 14:14 | ||||||
|
зная си, питон с нуля изучать не придется. си поможет быстро освоить питон. а в том, что придется познать нечто принципиально новое. что повлечет за собой изменения и в мышлении, и во взглядах на вещи. Добавлено через 37 секунд
0
|
||||||
|
Модератор
3134 / 2281 / 469
Регистрация: 26.03.2015
Сообщений: 8,878
|
|||||
| 17.05.2016, 16:38 | |||||
|
Простейший пример: Mожно написать в Питоновском стиле: "{name} хочет есть {food}".format(name="Боб", food="лазанью") а можно в Си стиле: "%s можно %s %s способом" % ("строки", "интерполировать", "старым") Программу, написанную на Питон, нельзя один в один перевести на Си, потому что в Си нет срезов, ассоциативных массивов, циклов "for in", исключений, анонимных (lambda) функций, встроенных функций высшего порядка, классов и так далее. Учебник состоит из 8 глав. Массивы - в первой главе. Типы - во второй. Указатели - в пятой.
0
|
|||||
|
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
|
|||||
| 17.05.2016, 19:12 | |||||
|
использует ручную работу с памятью. питон не умеет ручную работу с памятью. продемонстрируйте мне пожалуйста сишный малок на питоне. для сишника - это лишь синтаксический сахар. компилятор делает за него то, что до этого ему приходилось делать вручную. в отличие от питониста. который думает, что объект - это "неккая сущность", которая для него вполне себе реально наделена свойствами и умениями. сишник понимает, что это - всего лишь кусок памяти. а питонисту и не нужного этого понимать, что бы успешно писать код. язык инкапсулировал от него это знание. поэтому, он может руководствоваться более простой и высокоуровневой абстракцией. потом такой питонист начнет учить си, и его мир изменится раз и навсегда. он больше никогда не будет таким же простым, как прежде. а ещё в главе "массивы" не дается никакого определения, чем на самом деле является массив. зато используются булевые ветвления, которые в книге так же описываются позже. материал в этой книге преподносится немножко рывками. а вообще то все эти 8мь глав - базовый курс языка. это и есть объяснение этой простой мысли. хз, как ещё можно её до вас донести. буквально сегодня был случай: ещё один паренек повстречался. формально, он - программист с++. вот только он начал с си быдлера. и вот итог: человек не различает, где язык, где ИДЕ, где компилятор. вообще не ориентируется в пространстве. попытка освоить "вижуал с++" привела его к полной дезоринтации. и это можно понять: си быдлер - высокоуровневая rad-технология. её не существует в отрыве от ИДЕ. а пареньку теперь придется заново учить с++. хотя казалось бы, именно на нем он и писал до этого. и на моей памяти это - не единственный случай. при переходе с более высокого уровня на более низкий, человек открывает для себя столько разных нюансов, о которых он бы даже и не подумал бы. и ему приходится занового учиться.
1
|
|||||
|
Модератор
3134 / 2281 / 469
Регистрация: 26.03.2015
Сообщений: 8,878
|
|||||
| 17.05.2016, 22:16 | |||||
|
И почему обязательно "сишный малок". В питоне свои команды для выделения памяти. Сишник понятия не имеет ни про классы, ни про функции высшего порядка. Он не только запрограммировать их не может, ему даже такая идея в голову не придёт. А если кто-нибудь запрограммирует это за него, он не сможет их правильно использовать, так как не знаком с соответсвующими шаблонами программирования. Откуда ему это знать, если только он не изучал ООП и ФП? Какую мысль Вы пытаетесь донести до меня? Что на свете есть много программистов, не знающих С++? Верю. Полагаю, что программистов, не знающих Haskell ещё больше. Что-то ни разу не слышал, чтобы у человека, хорошо знающего Хаскель и C# были какие-то проблемы с изучением Си. Скорее уж наоборот. И, чтобы не быть голословным, назовите пару ньюансов, которые при изучении Си откроет для себя хороший специалист по VB 6.0 (по сути, а не по синтаксису).
0
|
|||||
|
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
|
||||||||||||
| 18.05.2016, 00:49 | ||||||||||||
|
как именно сишники решают свои поставленные задачи? зайдите на гитхаб, ткните наугад в любой сишный проект, и задайте вопрос её разработчику: какая у него была цель: написать софтину, или вручную работать с памятью? один-к-одному переложить на питоновский. сишники работают с памятью. с их точки зрения все есть "куски памяти, и функции их обработки". у меня тут валяется код, который позволяет перехватывать чужие функции. и инжектить в них трамплин (машинный код для прыжка на другие функции). если не справились с маллоком, ну покажите, как вы на питоне один-к-одному выполните перехват какой нибудь winapi функции? никакой работы с памятью напрямую. тем паче - в ручную. вы никак не положите один-к-одному коды этих языков просто потому, что у самих языков слишком разный дизайн. что прямо вытекает из различий областей их применения. я начинаю сильно подозревать, что о сишке вы только по наслышке слышали. тогда я поясню ещё раз: когда я писал: но так же имеет понимание, как это реализуется на уровне компилятора. у него есть понимание "низкоуровневой реализации", просто потому, что он много раз делал нечто подобное. разница между высокоуровневыми языками и сишкой заключается в том, что на сишке программисту приходится делать все ручками. и если он ошибётся, то это будет его головняк. а на высокоуровневых языках компиляторы автоматизируют рутину, инкапсулируя её от программистов. (он - процедурный), но на нем самом они прекрасно реализуются. не знаю, как насчет фп. полагаю как минимум многие из её элементов используются. а вот ооп используется и ещё как. например, гляньте в сторону библиотеки gtk+ это красноречивый пример объектно ориентированной архитектуры. хотя написана она на чистом си. просто некоторые задачи лучше решаются с использованием ооп, а не процедурной. а в результате ничего не знает о кэш-миссах, например. чем спускаться. поэтому спуск займет больше времени, чем подъём. человек может двигать мышкой и не знать с++. а может выучить с++, а потом подвигать мышкой. осознаете разницу? изучение с++ начинается с основ. а его основа - си. исповедующие разные парадигмы - полиглот. Добавлено через 7 минут огромный мир, который был заботливо инкапсулирован от него VB. такой хороший специалист верно хорошо понимает работу с COM. и находит её простой и понятной. у него будет прекрасная возможность узнать как на самом деле этот COM устроен. правда изучать придется полностью с нуля. с книжек для самых маленьких. и на один только COM у него уйдет времени больше, чем он потратил на весь VB вместе взятый.
1
|
||||||||||||
|
Модератор
3134 / 2281 / 469
Регистрация: 26.03.2015
Сообщений: 8,878
|
|||||
| 18.05.2016, 11:04 | |||||
|
hoggy,
Наконец-то я начинаю понимать Вашу мысль. Вы утверждаете, что если человек хочет научиться программировать и для этого изучить несколько языков, то лучше сначала пару месяцев потратить на Си, а потом приступать к остальным языкам (а не наоборот), потому что: за пару месяцев изучения Си он будет знать не только Си, но ООП, ФП (причём, не только концепции, но и как это реализуется на уровне компилятора) и так далее... и после этого легко и быстро выучит Java и Haskell. а за пару месяцев изучения Python/Java он научится только мышкой по экрану двигать... Один-к-одному не значит, что я возьму Си-код и откомпилирую его под Хаскель. Это значит, что каждой конструкции (в широком смылсле) кода на Си будет соответсвовать определённая конструкция на Haskell. Например, каждому циклу будет соответсвовать описание и вызов рекурсивной функции. Задача состоит в том, чтобы получить нужный результат, а не в том, чтобы использовать malloc или какую другую функцию. Например, если мне надо считать с консоли 10 чисел, я просто создаю массив. Зачем мне malloc? Иногда приходится сложнее. Например, была у меня задача вызвать некую АПИ функцию (на VB 6.0). Функция возвращает структуру А, одним из полей которой является массив структур Б. На VB я не могу описать дословно такую структуру, так как в VB указатель на массив не является указателем на первый элемент. Решение: Вызываем АПИ-функцию, передавая ей пустой указатель. Функция (согласно документации) возвращает мне размер памяти, необходимый для результата. Выделяем нужное количество памяти (просто как массив байт). Вызываем АПИ-функцию, получаем результат (который у нас описан как массив байт). Вычисляем адрес первого элемент массива структур Б в результате (то есть, в структуре А). Описываем массив структур Б, вычисляем адрес первого элемента. Копируем из одного адреса в другой нужное количество байт. Задача решена. На питоне при желании можно даже вот так писать: x86.mov(eax, MemRef(edi, disp = 0, index = ecx, 4)
0
|
|||||
|
0 / 0 / 0
Регистрация: 12.05.2016
Сообщений: 46
|
|
| 18.05.2016, 15:48 [ТС] | |
|
Shamil1, hoggy, Usaga, я извиняюсь, тут видимо спор возник небольшой)
я мельком прочитал, и увидел, все из вас говорят про парадигмы программирования(функциональное, процедурное, ООП). Можете сказать к какому из этих пунктов C относится, и есть ли книжки по этой парадигме. Может я конечно понятие само парадигмы не очень понял. Спасибо!! P.S. не хотел новый вопрос создавать, может вы знаете.
0
|
|
|
14138 / 9366 / 1350
Регистрация: 21.01.2016
Сообщений: 35,219
|
|
| 18.05.2016, 15:51 | |
|
immortalWarrior, на википедии есть подробное описание.
0
|
|
|
0 / 0 / 0
Регистрация: 12.05.2016
Сообщений: 46
|
|
| 18.05.2016, 16:02 [ТС] | |
|
Usaga, да, я поискал, нашёл уже, спасибо)
0
|
|
|
42 / 42 / 17
Регистрация: 25.04.2014
Сообщений: 499
|
||
| 22.05.2016, 01:20 | ||
|
0
|
||
| 22.05.2016, 01:20 | |
|
Помогаю со студенческими работами здесь
40
Разработка, внедрение и адаптация программного обеспечения отраслевой направленности Защита программного обеспечения Проанализировать, что привело к возникновению программного обеспечения, в частности операционных систем Тестирование программного обеспечения Учет программного обеспечения Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога
Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
|
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
|
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога
В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
|
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога
Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
|
|
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога
Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
|
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога
Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
|
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования.
Часть библиотеки BedvitCOM
Использованы. . .
|
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога
SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
|