Читабельность кода
"В массиве целых чисел (не более 100 элементов), не превосходящих по модулю 1000 и среди которых нет равных, найти порядковый номер третьего по величине числа.
Например:
Число чисел 10
1-е 1
2-е 6
3-е 7
4-е -51
5-е -10
6-е -16
7-е 71
8-е 53
9-е 11
10-е -13
Ответ: третье по величине число имеет порядковый номер 9.
Т.е. первое, самое большое число - 71, второе - 53, а третье - 11
Но как показать именно порядковый номер и как найти третье число?
Пока вот нашел только максимальный элемент.
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
const int n = 10;
int[] a =new int[n] { 1, 6, 7, -51, -10, -16, 71, 53, 11, -13 };
int max = a[0];
for (int i = 1; i < n; i++)
if (a>max) max=a;
Console.WriteLine("Максимальный элемент= "+ max);
}
}
}
Вообще по идее нужно написать вот так:
Но тогда выскакивает непонятное окно с ошибкой. Хотя когда я пишу:
то все нормально, и программа выбирает второй максимальный элемент.
максимальное количество проходов в данном случае равна mas*num-num
минимальное - num
а вот без порчи масива
#define mas 10
#define num 3
void main()
{
int m[mas] = {1, 6, 7, -51, -10, -16, 71, 53, 11, -13};
int i=1, k=0;
int n[num]= {min, min, min};
while(m>m[k]?n[0]=m,k=i,i=1:m>n[1]&&m<n[0]?n[1]=m,++i<mas:m>n[2]&&m<n[1]?n[2]=m,k=i,++i<mas:++i<mas);
cout << k << " - " << n[num];
}
но аптимизировано для num = 3
для других num не будет работать
прочтешь пятерку с плюсом получишь :)
а вот код для любого num при (0 < num < mas)
#define max 1000
#define mas 10
#define num 3
void main()
{
int m[mas] = {1, 6, 7, -51, -10, -16, 71, 53, 11, -13};
int i=1, k=0, n=min, h=max, s=0, r=0, t=0;
while(i+1==mas&&n<h?h=n,r=t,k=0,i=1,s++,m>m[k]?m<h?n=m,t=i,k=i,i=1:++i,s+1<=num:++i,s+1<=num:m>m[k]?m<h?n=m,t=i,k=i,i=1:++i,s+1<=num:++i,s+1<=num);
cout << " r=" << r << " H=" << h << endl;
}
хотя есть глюк :) при num > 5. Кто сможет сказать какой? :)
как нить в следующий раз исправлю...
а вот код для любого num при (0 < num < mas)
#define max 1000
#define mas 10
#define num 3
void main()
{
int m[mas] = {1, 6, 7, -51, -10, -16, 71, 53, 11, -13};
int i=1, k=0, n=min, h=max, s=0, r=0, t=0;
while(i+1==mas&&n<h?h=n,r=t,k=0,i=1,s++,m>m[k]?m<h?n=m,t=i,k=i,i=1:++i,s+1<=num:++i,s+1<=num:m>m[k]?m<h?n=m,t=i,k=i,i=1:++i,s+1<=num:++i,s+1<=num);
cout << " r=" << r << " H=" << h << endl;
}
хотя есть глюк :) при num > 5. Кто сможет сказать какой? :)
как нить в следующий раз исправлю...
Я за такой код не оценки бы ставил, а руки отрывал... за ненадобностью, т.к. такой код пишут тем, что не из плеч растет.
Кроме того программа нерабочая. Попробуй поменять 11 и 71 местами.
Кроме того программа нерабочая. Попробуй поменять 11 и 71 местами.
И чем тебе такой код не нравится? Тем, что ты его прочитать не можешь? Тогда грош тебе цена как программисту.
И кстати - менял 11 и 71, все работает, глюк как я уже сказал, имеется, но в другом плане, и ты не смог его найти.
Для тех, кто думать не хочет, я предлагал простой и не затейливый код выше, этот код я пишу для тех, кто желает думать.
И кста, существуют конкурсы по написанию однострочных алгоритмов.
И этот далеко не самый сложный, я видел строку в несколько сотен символов.
исправил глюк, работает при любом масиве и любом num:
#define max 1000
#define mas 10
#define num 3
void main()
{
long m[mas] = {1, 6, 7, -51, -10, -16, 71, 53, 11, -13};
long i=-1, k=-1, r=-1, t=-1, s=0;
while(i!=-1&&i==mas&&(t==-1?min:m[t])<(r==-1?max:m[r])?r=t,k=-1,i=-1,s++:(i==-1?min:m)>(k==-1?min:m[k])?(i==-1?min:m)<(t==-1?max:m[r])?t=i,k=i,i=-1:++i,s+1<=num:++i,s+1<=num);
cout << num << ":" << " r=" << r << " m[r]=" << m[r] << endl;
}
Я то его прочитать могу, именно прочитать, а код должен восприниматься интуитивно.
Вот ты свой же код прочитать и не можешь, не говоря о том, чтоб заставить его работать.
И кстати - менял 11 и 71, все работает,
глюк как я уже сказал, имеется, но в другом плане, и ты не смог его найти.
А я его в этой помойке, что ты называешь "кодом", и не искал. Подобный мусор даже трогать не хочется.
Для тех, кто думать не хочет, я предлагал простой и не затейливый код выше, этот код я пишу для тех, кто желает думать.
ДумаТьвтвОемпонИМаниизАклЮчаетСяВрасшиФровкЕкараКуль?
Тогда спешу тебя разочаровать: совсем не в этом работа программиста.
И кста, существуют конкурсы по написанию однострочных алгоритмов.
И этот далеко не самый сложный, я видел строку в несколько сотен символов.
А ещё есть конкурсы на пожирание гамбургеров на скорость, плевков на расстояние, кто громче освободит кишечник... много разных конкурсов есть...
исправил глюк, работает при любом масиве и любом num:
#define max 1000
#define mas 10
#define num 3
void main()
{
long m[mas] = {1, 6, 7, -51, -10, -16, 71, 53, 11, -13};
long i=-1, k=-1, r=-1, t=-1, s=0;
while(i!=-1&&i==mas&&(t==-1?min:m[t])<(r==-1?max:m[r])?r=t,k=-1,i=-1,s++:(i==-1?min:m)>(k==-1?min:m[k])?(i==-1?min:m)<(t==-1?max:m[r])?t=i,k=i,i=-1:++i,s+1<=num:++i,s+1<=num);
cout << num << ":" << " r=" << r << " m[r]=" << m[r] << endl;
}
Ага, и про этому выдает ответ -13 ?
в атаче рабочий код и рабочая прога
Да, есть, только в отличии от мною названого после этих конкурсов победителей не приглашают на должность ведущего программиста за 5000-15000$
А если серьезно: почитай любую статью для начинающих аля "Как правильно оформлять программный код" - и все вопросы отпадут. Там же кстати разъяснено почему надо оформлять код именно так, а не иначе..
Удачи с "должностью" :D
А если серьезно: почитай любую статью для начинающих аля "Как правильно оформлять программный код" - и все вопросы отпадут. Там же кстати разъяснено почему надо оформлять код именно так, а не иначе..
Удачи с "должностью" :D
скажем так я и есть ведущий
тот же самый код только для ленивых:
using System.Collections.Generic;
using System.Text;
namespace a
{
class Program
{
static void Main(string[] args)
{
const int min = -1000;
const int max = 1000;
const int mas = 10;
const int num = 3;
long[] m = new long[mas] {1, 6, 7, -51, -10, -16, 71, 53, 11, -13};
long
i = -1,
k = -1,
r = -1,
t = -1,
s = 0;
while (s + 1 <= num)
{
long t1;
long r1;
if (t == -1) t1 = min;
else t1 = m[t];
if (r == -1) r1 = max;
else r1 = m[r];
if (i == mas && t1 < r1)
{
r = t;
k = -1;
i = -1;
s++;
}
else
{
long i1;
long k1;
long tr;
if (i == -1) i1 = min;
else i1 = m;
if (k == -1) k1 = min;
else k1 = m[k];
if (r == -1) tr = max;
else tr = m[r];
if (i1 > k1)
{
if (i1 < tr)
{
t = i;
k = i;
i = -1;
}
else
{
++i;
}
}
else
{
++i;
}
}
}
Console.WriteLine("Индекс максимального элемента= " + r + " Максимальный элемент= " + m[r]);
}
}
}
в атаче рабочий код и рабочая прога
Да нет, не рабочая программа.
Поэтому, прокоментирую твою предыдущую версию.
Расшифровываем твое однострочие.
И так, ты перебираешь массив столько раз, какое наибольшее число надо найти. Т.о. у тебя два цикла: один считает порядок наибольшего числа, другой - делает пробежку по циклу на поиск наибольшего меньше заданого. При этом при нахождении локального максимума ты заново начинаешь проход по массиву. Этого делать совершенно не надо. Кроме того, ты заводишь совершенно не нужные переменные, твкаие как t и n.
В результате твой код рефакториться к следующему:
#define mas 10
#define num 3
int main()
{
int m[mas] = {1, 71, 6, -51, -10, -16, 7, 11, 53, -13};
int prevMax = max;
int curMaxIndex;
for(int s = 0; s < num; s++) {
curMaxIndex = 0;
for(int i=1; i < mas; i++) {
if(m>m[curMaxIndex] && m< prevMax) {
curMaxIndex = i;
}
}
prevMax = m[curMaxIndex];
}
cout << " r=" << curMaxIndex << " H=" << m[curMaxIndex] << endl;
return 0;
}
Кстати, твой глюк ушел автоматически лишь за счет аккцратности кода.
Но т.к. это magic number 1000 режит глаза, избавляемся от него:
{
const int num = 3;
int m[] = {1, 71, 6, -51, -10, -16, 7, 11, 53, -13};
int prevMax;
int curMaxIndex = 0;
for(int i=1; i < sizeof(m)/sizeof(m[0]); i++) {
if( m>m[curMaxIndex] ) {
curMaxIndex = i;
}
}
for(int s = 1; s < num; s++) {
prevMax = m[curMaxIndex];
curMaxIndex = 0;
for(int i=1; i < sizeof(m)/sizeof(m[0]); i++) {
if(m>m[curMaxIndex] && m<prevMax) {
curMaxIndex = i;
}
}
}
cout << " r=" << curMaxIndex << " H=" << m[curMaxIndex] << endl;
return 0;
}
Теперь об оптимальности.
Такой вариант будкт в общем случае выполняться за O(n*m), где n - номер наибольшего, m - размерность массива.
Вариант с сортировкой массива будет работать за O(m*log m). Т.о. вариант с сортировкой будет быстрее при n > log m.
Но существует ещё (как минимум) один вариант: можно попробовать сортировать не исходный массив, а массив наибольших значений непосредственно при его формировании.
Сомневаюсь.
Либо ты пишешь другой код, либо вы работаете над сверх секретным проектом, где главное не закончить качественно проект, а запутать противника.
В любом случае, ни после конкурса на самый нечитабельный код, ни после какого-либо другого подобного совершенно неприменимого на практике конкурса я бы человека на работу не взял. А тем более представившего такую помойку. Да ещё и на роль ведущего, где главное не код "колбасить", а доходчиво управлять и контролировать.
P.S. 15000 - это в год или в месяц? :D
Да, согласен, косяк оставшийся от твоего кода.
Но он легко исправляется в моем коде:
{
const int num = 9;
int m[] = {1, 71, 6, -51, -10, -16, 7, 11, 53, -13};
int prevMax;
int indexCurMax = 0;
int indexMin = 0;
for(int i=1; i < sizeof(m)/sizeof(m[0]); i++) {
if( m > m[indexCurMax] ) {
indexCurMax = i;
} else if( m < m[indexMin] ) {
indexMin = i;
}
}
for(int s = 1; s < num; s++) {
prevMax = m[indexCurMax];
indexCurMax = indexMin;
for(int i=0; i < sizeof(m)/sizeof(m[0]); i++) {
if( m > m[indexCurMax] && m < prevMax ) {
indexCurMax = i;
}
}
}
cout << " r=" << indexCurMax << " H=" << m[indexCurMax] << endl;
return 0;
}
ЗЫЖ Ты написал фактически тоже самое, но в другом исполнении
ЗЫЖ Ты написал фактически тоже самое, но в другом исполнении
Именно! Я написал то же самое, но значительно проще и понятнее.
Кроме того, несколько оптимальнее и работоспособнее на бОльших диапазонах входных данных.
На счет понятности - я легко читаю любой код
И даже такие?
int m[] = {1001, 71, 6, -51, -1001, -16, 7, 11, 53, -13};
Оптимальность? Не уверен, во многом зависит от компилятора
:D
Слушай, "ведущий", не смеши. При чем тут компиляторы? Я говорю о лишних итерациях.
На счет понятности - я легко читаю любой код
Опять врешь... ну да ладно.
А остальные тоже легко читают твой код?
Или ты сам себе ведущий? :)
int m[] = {1001, 71, 6, -51, -1001, -16, 7, 11, 53, -13};
:D
В условии четко сказано по модулю 1000, потому если ты заметил то мах и мин находятся в дефайне, и цели унлимитед я не ставил, с небольшой доработкой код будет работать с любыми числами с любыми массивами
Итераций у нас одинаковое количество, можешь посчитать. А вот for и while имеют немного разный вид в асме
А остальные тоже легко читают твой код?
Или ты сам себе ведущий? :)
Ну вру или нет - ты же не проверишь
Да, легко
Более того, я не возьму специалиста неспособного прочитать чужой код, хоть даже если он будет записан на салфетке от руки
Кроме того, мой пример дает новичкам некоторое представление об особенностях Си (которые обычно в учебниках не указываются), а так же представление о приоритетах операторов
Теперь количество итераций одинаково
#define max 1000
#define mas 10
#define num 3
void main()
{
long m[mas] = {1, 6, 7, -51, -10, -16, 71, 53, 11, -13};
long i=0, k=-1, r=-1, t=-1, s=0, q=0;
while(
m > (k==-1?min:m[k])?
m < (r==-1?max:m[r])?
t = i,
k = i,
++i
:++i
:++i,
i == mas && (t==-1?min:m[t]) < (r==-1?max:m[r])?
r = t,
k = -1,
i = 0,
s++,
s + 1 <= num
:s + 1 <= num
)q++;
cout << "q=" << q << " r=" << r << " m[r]=" << m[r] << endl;
}
Решение задачи обсуждается в другой теме!!
В любом случае, последний предложенный код barracuda по прежнему ужасен с точки зрения читабельности!!
Хотя замечу, что он научился пользоваться кнопочкой Enter. :D
З.Ы. Когда я писал еще в лицее на паскале - у меня раз был глюк компилера - програмка не компилилась - хотя должна была. После того как я красиво оформил код - повыравнивал и забрал лишние пробелы все заработало.) Так что лично я для себя оешил код писать нормально =)
Кроме того, мой пример дает новичкам некоторое представление об особенностях Си (которые обычно в учебниках не указываются), а так же представление о приоритетах операторов
Вообще-то, ты пытаешься использовать С++, а не С.
И какие это такие особенности? :)
Да, легко
Более того, я не возьму специалиста неспособного прочитать чужой код, хоть даже если он будет записан на салфетке от руки
Одно дело уметь читать код, а другое уметь писать понятный код. Писать понятный код - куда более практичный навык и куда более сложный в освоении.
У тебя явно смещены приоритеты и понятия о "крутости".
Для меня хороший код - тот, который не затрудняет сам по себе понимание алгоритма. Представленный тобой код совершенно не подходит под это условие.
В программировании (в настоящем, серьезном программировании) есть задачи куда более сложные, чем приоритеты выполнения операций. Для таких мелочей есть скобки.
Сложность программирования не в сложности написания кода, а в сложности выбора и реализации алгоритма. Код должен писАться не сложнее чем вращение педалей велосипеда и внешне он должен быть не сложнее, чем этот велосипед.
Код пишется для человека, а не для машины, и он должен помогать воспринимать алгоритм, а не создавать лишних помех.
Что касается "особенностей языка", то сложность и красота С++ не в записи в одну строку. Огромное количество механизмов на столько сложны, что только корректное их описание (именно описание а не колбасерство кода) делает возможным их понимание.
Вот тебе пример, на самам деле, простенького кода.
Что делает этот код (это совсем не сложно), и как он это делает (это посложнее)?
Сможешь рассказать прямо "с листа", не форматируя этот код?
Я его немного заобсифуцировал, как ты любишь. :)
using namespace std;
template<int>struct b{};typedef b<1>f;
struct r{};struct a{template<class T>a(T const&);};r operator<<(a const&,a const&);
template<class T,class U>struct sh{static char c(r);static int c(...);typedef b<sizeof(c(*(T*)0<<*(U*)0))>r;};
template<class T,class U>ostream&pp(ostream&s,T const&v,U){return s<<v<<endl;}
template<class T>ostream&pp(ostream&s,T const&,f){return s<<"unknown"<<endl;}
template<class T>ostream&p(ostream&s,T const&t){return pp(s,t,sh<ostream,T>::r());}
struct n{};
int main() {
p(cout, 1);
p(cout, "Hello");
p(cout, n());
return 0;
}
#define mas 10
#define num 3
void main()
{
int m[mas] = {1, 6, 7, -51, -10, -16, 71, 53, 11, -13};
int i=1, k=0;
int n[num]= {min, min, min};
while(m>m[k]?n[0]=m,k=i,i=1:m>n[1]&&m<n[0]?n[1]=m,++i<mas:m>n[2]&&m<n[1]?n[2]=m,k=i,++i<mas:++i<mas);
cout << k << " - " << n[num];
}
Аффтар жжешь, пеши есчо, токо желательно на просторах интернета, а не в реальных проектах:D
PS: Обфускаторы отдыхают:D
Обещаю без форматирования :)
но не сегодня, сегодня у нас пьянка, день металурга... :)
Ну конечно замудрил ты
В итоге ты всего лишь, определил вывод в cout в зависимости есть ли у типа свой оператор << , только лиш и всего, для типов не имеющих этого оператора ты опеределяешь его сам, и выводишь unknown (так как возвращаешь sizeof(static char c(r))) = 1. Но не буду скрывать что текст я парсировал. Но не потому что не понятен был, а потому что с темплетами не работаю.
PS а в воскресенье куда темы исчезали?
PS: Обфускаторы отдыхают:D
Просторы Интернета говоришь? А хочешь покажу тебе проект (очь не маленький) где все исходники именно такие? Сможешь ответить, почему там сдалано именно так?
http://www.domapi.com/index.cfm?action=download
http://www.domapi.com/index.cfm?action=download
Чтобы снизить читаемость кода?
http://ru.wikipedia.org/wiki/Исходный_код
- читаемость кода
- лёгкость в поддержке, тестировании, отладке и устранении ошибок, модификации и портировании
- низкая сложность
- низкое использование ресурсов — памяти, процессора, дискового пространства
- отсутствие замечаний при компиляции программы
И чоа это за проект? Неужели десятки тысяч разработчиков используют этот DomAPI? Ты бы еще показал код Вовы Пукина, который контрольную сваял на первом курсе ЭВМ.
Единственное оправдание такому коду - следующий программист пошлет всех в задницу и скажет, чтобы обращались к разработчику. И разработчик получит новый заказ. Но для этого есть и более культурные способы - не обязательно корчить из себя блаженного и пузырить соплями, что "все пидарасы, один я гагарин".
Эх... *махнул рукой и ушел разбирать коды предшественников*
Смысл "читабельности" того проекта в том чтобы Вова Пупкин как можно меньше качал из инета "пробелов, табуляторов, переводов строк"
О тебе как о пользователе заботятся....
И это не единственный подобный проект.
Тема миллион раз мусолилась в контексте html-кода - вот уж где действительно можно думать об экономии. Ну, и кто экономит? Загляните в код серьезного сайта, который посещается мильёнами людей в день - там всё ровно и красиво. И загляните в код какого-нибудь "хомяка", который никто в жизни не видел, но у которого весь код в одну строчку - "чтобы пользователи меньше качали".
И потом, судя по этой и предыдущей теме - если бы вы занимались не удалением пробелов, а серьезной оптимизацией своего кода, то пользователи действительно качали бы меньше.
При весе всей библиотеки src d 700 kb это плюсом 70 kb
Прибавь по 10% пробелов И табуляторов…
И при том что тема не раз мусолилась почему то везде где только можно применяют упаковщики.
То что "серьезные сайты" не оптимизируют код - это личное их отношение, и только.
Я оплачиваю каждый байт, так нафига мне оплачивать пробелы? Браузер их все равно не выведет.
Вы сильно преувеличивате.
Так же как выдавать нечитаемый код за шедевр - ваше личное отношение.
Мне Вас искренне жаль, Ваша жизнь значительно печальнее моей. Я больше не буду спорить с Вами, извините. Я не знал.
убиратькчертовойматериВСЕпробелыизтекстапризаписивбазу.
А что, оригинально?
Я бы НИКОГДА, не то что бы не взял на работу человека не способного читать подобный текст, что свидетельствовало бы о его низком коэффициенте IQ, [COLOR="Gray"](да, задачка реально для третего класса на соображаловку и отлов "особо одаренных" - найдите в "каше" букв последовательности формирующие слова)[/COLOR], я бы с ним не стал даже общаться :rolleyes:
По сути, если вы фрилансите с пятого на десятое - дело ваше, пишите хоть "узорчегом".
НО, не существует ли в серьезных организациях, при разработке крупных и не очень проектов спец. требований по оформлению кода? Или мне приснилось?
[QUOTE barracuda;202106]проект (очь не маленький) где все исходники именно такие? Сможешь ответить, почему там сдалано именно так? http://www.domapi.com/index.cfm?action=download[/QUOTE]
ВСЕ исходники? Именно ТАКИЕ?
Простите, а вы лично принимали участие в разработке и сможете подтвердить наличие/отсутствие общего документа описывающего именно ТАКОЙ стиль написания кода?
Лично я не стал бы отрицать его существования.
Теперь все сводится лишь к тому, что на данном форуме в правилах не указано НИКАКИХ требований к написанию самого кода, упоминается лишь о необходимости использования тегов форматирования. [COLOR="Gray"]Поправьте, если ошибаюсь.[/COLOR]
Говорит ли это о возможности выбора random стиля, или все же не стоит забывать об элементарном уважении, к тем, возможно даже новичкам, кто будет читать ваш код?
Ну конечно замудрил ты
В итоге ты всего лишь, определил вывод в cout в зависимости есть ли у типа свой оператор << , только лиш и всего, для типов не имеющих этого оператора ты опеределяешь его сам, и выводишь unknown (так как возвращаешь sizeof(static char c(r))) = 1. Но не буду скрывать что текст я парсировал. Но не потому что не понятен был, а потому что с темплетами не работаю.
PS а в воскресенье куда темы исчезали?
Что делает код ты в принципе определил правильно (а может и нет, т.к. до конца не разобрался), но вот как он это делает ты не понял, либо не расскрыл.
Намудрил? Реализуй подобную функциональность иначе. Посмотрим, кто намудрил.
P.S. Куда я возвращаю sizeof? :) Ничего я не возвращаю... Это compiled-time код.
Смысл "читабельности" того проекта в том чтобы Вова Пупкин как можно меньше качал из инета "пробелов, табуляторов, переводов строк"
О тебе как о пользователе заботятся....
:D :D :D
Я стараюсь редко быть таким критичным, но тут просто не удержаться: Ну и бред!!!
Намудрил? Реализуй подобную функциональность иначе. Посмотрим, кто намудрил.
P.S. Куда я возвращаю sizeof? :) Ничего я не возвращаю... Это compiled-time код.
Ну извини что не сказал все это формируется во время компиляции
Первое что я сделал это откомпилил, и увидел результат. Далее увидел два темплета pp() у которых третий параметр разный, более того в теле pp() третий параметр не используется, но вызов pp(s,t... происходит в разные темплеты, далее просто, если поити по коду то вызов sh<ostream,T>::r() вернет b<1> или b<4>
b<1> у тебя определен как тип f
Теперь более определенно рассказал код? Или еще рассказать почему sh<ostream,T>::r() возвращает разные типы?
Прежде чем отвечать я проверил, добавил перед вызовом pp()
s << sizeof(sh<ostream,T>::c(s << t)) << " ";
Но есть не мало старых проектов, которые мы поддерживаем в рабочем состоянии. Которые написаны еще похлеще чем предлагал я. И разбираться в них нам приходится. И ничего страшного в этом я не вижу. Есть программы, которые собирались буквально на коленях, так как работаем мы на производстве, где тормозить процесс невозможно. Потому дыры латались, не останавливая основных модулей.
Да, в результате образовывается некий бардак, но в ходе последующей работы заплатки вылизываются. Но так как они все же присутствуют их приходится разгребать. И разгребать и вылизывать приходится на рабочем объекте.
Вы меня не убедили, почему начинающим программистам нельзя задавать задачки на тот же «читабельность кода»
У меня побывало не мало программистов после вышки, бьющих себя в грудь что они взламывали пентагон, но достаточно поставить перед ним задачу – разобрать завал кода, как тут же он скисает.
Лично сам я начинал с машинных кодов Z80, когда компиляторов днем согнем не сыщешь. И ничего – разгребал.
Предлагаю тему закрыть