2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




Начать новую тему Ответить на тему На страницу Пред.  1, 2, 3, 4  След.
 
 Re: Эффективное изложение информации
Сообщение13.03.2021, 19:40 


12/07/15
2956
г. Чехов
Я уже на протяжении долгого времени судачу, что на экране должно отображаться нечто, что соответствует коду и одновременно задаче (проблеме, цели) программиста: Отображение = f(код, задача). Не нужно отображать то, что не соответствует задаче. Я предложил способ интерактивной формулировки переменной "задача". Однако есть проблема в том, что иногда разработчик сам не знает свою задачу, то есть формулировка задачи - это тоже проблема...

Может быть туда еще надо вписать тезаурус разработчика: Отображение = f(код, задача, тезаурус). Не нужно отображать то, что разработчик и так знает. Но это очень сложно на данном этапе, так как трудно сказать, что данный разработчик знает или не знает.

Большинство IDE придерживается очень простого принципа: Отображение = код. Каков код написан, так он и отображается. Но в общем есть тенденция неких усложнений/улучшений, наблюдается отклонение от данной формулы. Ну пусть это будет формула: Отображение = f(код).

Вот бы написать простейшее приложение, чтобы выполнить апробацию, развить теорию...

 Профиль  
                  
 
 Re: Эффективное изложение информации
Сообщение13.03.2021, 20:14 
Заслуженный участник


27/04/09
28128
Ну вот вы тоже получается точно не знаете, как формулируется ваша задача. :-) А кто знает?

 Профиль  
                  
 
 Re: Эффективное изложение информации
Сообщение13.03.2021, 22:33 


12/07/15
2956
г. Чехов
Приложение-то необязательно писать, просто взять код, придумать задачи и нарисовать, какое должно быть отображение...

 Профиль  
                  
 
 Re: Эффективное изложение информации
Сообщение17.03.2021, 03:34 


12/07/15
2956
г. Чехов
Для сравнения: Sourcetrail - опенсорсная утилита анализа кода.

http://linsoft.info/soft/sourcetrail.html

На гифке показано, как можно скользить по ссылкам: от функции run() к функции show().
Однако выбор был не относительный, а абсолютный, но графика отрисовалась красиво.

Можно было бы примкнуть к проекту, создать форк, чтобы реализовать свои идеи. Но, к сожалению, я никогда не участвовал в командной разработке... Да и времени нет.(

Sourcetrail: инструмент, чтобы разобраться в чужом коде и не выстрелить себе в голову
https://habr.com/ru/company/ruvds/blog/547322/

 Профиль  
                  
 
 Re: Эффективное изложение информации
Сообщение27.03.2021, 08:09 


12/07/15
2956
г. Чехов
На Хабре регулярно проскакивают статьи с идеями совершенствования процесса программирования. Но все они нацелены на улучшение языка программирования, чтобы он наиболее точно отражал особенности предметной области, то есть развитие состоит в надстройке более высокоуровневых абстракций. Другое направление - графическое представление ЯП или другие способы сделать ЯП нативным.
Все направления сконцентрированы на исходном коде, который (когда уже готов) ясный, понятный, выполнимый, строгий, однозначный.

Я же обратил внимание, что не все на исходном коде помешалось. Были сложные трудновоспроизводимые умозаключения, мысленные эксперименты, переборы и в итоге вырисовалось следующее: программист не работает с исходным кодом целиком, он постоянно абстрагируется, на экране отображается не исходный код, а его часть. Фредерик Брукс со своей несуществующей серебряной пулей ошибался: программисту не страшна сложность, так как он постоянно и успешно декомпозирует задачу. Декомпозиция - это частный случай абстракции, если угодно, кросс-абстракция - когда задача бьётся на подзадачи и потом подзадачи решаются по отдельности, от остальных подзадач абстрагируются.

Абстракция, абстракция, абстракция... Я понял, что нам не хватает абстракции в языках программирования. Это и есть серебряная пуля. Нужно научиться правильно абстрагироваться, то есть отбрасывать ненужное и оставлять нужное. Тут на форуме правильно отметили: все зависит от задачи разработчика, которую он пытается решить с кодом (написание кода, добавление новой функциональности, рефакторинг, локализация ошибки, изучение кода/алгоритма).
На данном этапе я наивно предполагаю, что все задачи разработчика сводятся к системному подходу, когда необходимо определить границу системы, то есть ее входы и выходы. Выглядит логичным.

Я обратил внимание, что границы систем уходят за пределы кода. Тут я ввел понятие "окружение кода". Это внешние библиотеки, компилятор, операционная система, железо.
Теоретически границы проектируемой системы могут выходить очень далеко за пределы компьютера и могут включать в себя социальные системы, экономические, политические... Это все системология... Граничные элементы рассматриваемой системы я называю терминалами (конечными остановками). Имеется очень важный набор стандартных терминалов, которых достаточно большинству разработчиков.
- Экран (дисплей)
- Аудиоколонка
- Принтер
- Сканер
- Клавиатура
- Мышь (короче, стандартная периферия)
- USB-порт
- Ethernet-порт
- Базы данных
- Файловая система
- Операционная система

Разработчик работает лишь с переменными и функциями (данным и кодом), а взаимодействие с терминалами происходит опосредованно через функции системной библиотеки, API операционной системы, через события.
Часто несоответствия и требования идут из дальнего окружения (окружение за пределами терминалов). "Неправильно выводится сумма счета". "Выскакивает сообщение об ошибке обращения к памяти". И так далее.

В существующих IDE разработчик на основании своего опыта определяет связи между кодом и терминалами. Например, он знает, что на изображение на экране влияют системные функции printf(), cout, объекты семейства системных классов GraphicObject и др. Ему не стоит труда (точно без труда?) найти ошибку в программе, зная формулировку ошибки в терминах терминала.
Однако эти связи можно описать кратко на абстрактном языке и избавить голову разработчика, а во многих случаях обеспечить поддержку отслеживания связи в автоматическом режиме.
Разработчик указывает терминал "экран" в качестве Y-границы, X-граница автоматически указывает на функции printf(), cout, объекты GraphicObject, используемые в коде. Правее границу X двигать нет смысла, так как код программы полностью выпадет из рассмотрения, но влево ее сдвигать можно. Этот XY-навигатор просто получится чудесным!

И вот тут стоит кропотливая задача описания на абстрактном языке всех систем, которые лежат между стандартными терминалами и кодом. Туда попадают операционные системы, компиляторы, системные библиотеки, протоколы, железо. Описание должно быть максимально сжатым, эта задача в общем-то вынесена в заголовок темы.

Абстрактное описание связи между выводом printf() и терминалом "экран" будет безумно простым (ниже приведено абстрактное описание stdio.h):
Код:
... printf(...);
terminal display = abstract(printf().parameters);

Абстрактное описание гласит: "мол, есть такая функция printf() в stdio.h, которая влияет на отображение на экране.". Такое описание позволит успешно работать XY-навигатору с терминалом "экран".
Я пока не придумал, как иначе обратиться к параметрам функции, по всей видимости, для некоторых языков придется вводить подобные абстракции, ничего в этом запретного нет.

Я фактически предлагаю computer aided abstraction (поддержку IDE в абстрагировании). Сейчас этого нет в IDE, так как не хватает ключевых винтиков, чтобы научить компьютер абстрагироваться вместе с программистом - абстрактного языка и абстрактных описаний.

-- 27.03.2021, 10:35 --

Можно так:
Код:
... printf(printf_parameters);
terminal class display = abstract(printf_parameters, display, ...);

Функция printf() не просто обновляет изображение на дисплее, а вносит в него изменения.

Класс display можно разбить на два подкласса Console и Graphic. И так далее.

Можно делать описания любой степени подробности вплоть до точного описания (если, конечно, граница системы не выходит за пределы языка программирования).

 Профиль  
                  
 
 Re: Эффективное изложение информации
Сообщение28.03.2021, 16:29 
Заслуженный участник


27/04/09
28128
Mihaylo в сообщении #1511503 писал(а):
Функция printf() не просто обновляет изображение на дисплее, а вносит в него изменения.
Поздравляю, вы открыли эффекты. :-)

Я всё-таки не вижу до сих пор какого-то ясного изложения идей и рамок их расплывания, чтобы что-то добавить (а то вам наверно скучно?).

Я бы предложил делать абстракции прямо выразимыми на используемом языке, чтобы не плодить промежуточное представление, которое тоже придётся изучать — если абстракции прямо выражены, мы можем просто применять к ним конкретные аргументы в конкретном коде, и если компилятор и язык достаточно хороши, абстракции будут стоить нам не очень много и нам не придётся писать отдельно специализированный код, который резко возрастает в сложности. Но и это отдельная задача от задачи помощи в понимании сложного кода.

 Профиль  
                  
 
 Re: Эффективное изложение информации
Сообщение28.03.2021, 18:02 


12/07/15
2956
г. Чехов
arseniiv в сообщении #1511852 писал(а):
Я бы предложил делать абстракции прямо выразимыми на используемом языке, чтобы не плодить промежуточное представление

Предложенный абстрактный язык почти прямо выразим на любом стандартном ЯП. Очень грубо говоря, все, что нам не нужно, мы заменяем на многоточие (...). Замечено, что исходный код состоит из различных списков и множеств, соответственно на многоточие заменяются отдельные элементы списков и множеств, и практика показывает, что этого уже вполне достаточно, чтобы образовать вполне полноценный абстрактный язык. Еще приходится вводить ключевое слово abstract, чтобы преодолеть засилие многоточия. То есть то, что вы желали бы видеть у абстрактного языка, оно уже есть - очень простые принципы абстрагирования и сильная связь со спецификацией стандартного ЯП. Я накидал правила абстрагирования буквально на коленке.

arseniiv в сообщении #1511852 писал(а):
Поздравляю, вы открыли эффекты. :-)

Знаете... На абстрактном языке еще надо научиться программировать... Процесс, конечно, называется не программирование, а описание, наверное, или разработка...

 Профиль  
                  
 
 Re: Эффективное изложение информации
Сообщение28.03.2021, 19:20 
Заслуженный участник


27/04/09
28128
Mihaylo в сообщении #1511867 писал(а):
Предложенный абстрактный язык почти прямо выразим на любом стандартном ЯП. Очень грубо говоря, все, что нам не нужно, мы заменяем на многоточие (...).
Ну это не «выразим». Я имею в виду, что абстракции должны быть нормальными определимыми в языке именами/выражениями, которые можно прямо скомпилировать, не добавляя в исходный текст почти ничего кроме зависимостей этой конструкции и уж точно ничего не заполняя внутри кусков кода.

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

Mihaylo в сообщении #1511867 писал(а):
На абстрактном языке еще надо научиться программировать...
Так это, ещё раз, недостаток, а не достоинство. Better code is less code. Добавлять ещё одну зависимость — усложнять жизнь на долгой стадии поддержки кода, когда из него уже ничего толком не выкинешь.

Mihaylo в сообщении #1511867 писал(а):
Я накидал правила абстрагирования буквально на коленке.
В этом и проблема: на коленке довольно просто что-нибудь накидать, но довести идеи до рабочего прототипа с полезными свойствами, которые, надо надеяться, сохранятся в уже не прототипе в будущем, — работа, которую нельзя оставлять кому-то желающему продолжить, потому что у автора идеи нет времени: желающих банально не будет. Если будут, поймут всё по-своему (но это уже обычно не проблема) или не смогут надоить у этой идеи молока.

Про эффекты я не зря написал: не нужно изобретать что-то особое, чтобы уметь выражать в языке, какие функции требуют какой-то контекст и что они делают какой-то вид побочных эффектов. Это выразимо прямо в типах в языках с коэффектами (это для контекста) и эффектами. Это ещё развивающаяся область исследований, но не прям вчера родившаяся. В том же хаскеле есть библиотеки для выражения произвольного набора композируемых друг с другом эффектов, расширяемого при надобности. С помощью инкапсуляции любой набор примитивов можно раскидать по введённым с чистого листа эффектам и сделать явно видимым в коде, какой побочный эффект будет, гарантированно (иначе не скомпилируется, если мы не используем примитивы напрямую мимо определённой нами оболочки — но такое прямое использование нетрудно отслеживать, особенно если эффект уже был, типа IO в хаскеле, и мы его просто растащили на мелкие более модульные).

 Профиль  
                  
 
 Re: Эффективное изложение информации
Сообщение29.03.2021, 04:30 


12/07/15
2956
г. Чехов
arseniiv
Вы точно поняли, что абстрактный язык должен использоваться не для программирования, а для описания/разработки? У этого языка более широкое пространство применения, следовательно, он включает в себя ЯП, а не наоборот.

Нет цели делать язык компилируемым, но он должен быть анализируемым автоматически.

Также язык должен быть человеко-читаемым.

-- 29.03.2021, 07:20 --

У меня еще есть неозвученные здесь на форуме идеи по поводу языка. Эти идеи не связаны с абстракциями (упрощением).

1. Среди прочего, есть идея так называемого внедрения архитектурного сахара - это противоположный абстракции процесс, когда в описание, наоборот, вводятся излишества, синонимы и прочая дублирующая информация. Зачем? Чтобы потом можно было абстрагироваться по-разному. :D К сожалению, не всегда язык программирования можно легко перестроить на внедрение архитектурного сахара. Либо я пока не догадался как.
Для разработки это нужно, потому что разработчик не всегда сразу умеет правильно выражать свою мысль. Он может одну и ту же мысль выразить по-разному и неясно, какая из них лучше встроится в структуру.
Для описания - чтобы можно было вкладывать избыточную информацию, улучшающую понимание при необходимости (внедрение альтернативных формулировок).

2. Уход от комментариев в исходном коде: замена человеческого языка в комментариях на абстрактный язык. Сформулировал несколько языковых конструкций, которые позволят это сделать. Вместо языка комментариев можно использовать анализируемый абстрактный язык. От комментариев остается лишь функция перевода имен классов, объектов, переменных, функций, объяснение на удобоваримом языке - так называемая функция docstring.

3. Обдумываю языковые конструкции, которые позволят хранить информацию, которая невыразима абстрактным языком. Эта информация - оценка важности (рейтинга). Например, класс pushbutton имеет важность 0.9, а класс simplepushbutton имеет важность 0.2. Скорее всего какая-то связь с п.1: есть потребность делать описание системы не просто внутренним принципом ее работы, а описывать ее место в окружающем пространстве.

Это все подчинено одной общей цели - дать возможность описывать сложные разрабатываемые системы на анализируемом языке. Анализируемость языка позволит обеспечить computer aided development (CAD). В принципе задача достижима.

 Профиль  
                  
 
 Re: Эффективное изложение информации
Сообщение29.03.2021, 19:43 
Заслуженный участник


27/04/09
28128
Mihaylo в сообщении #1511965 писал(а):
Вы точно поняли, что абстрактный язык должен использоваться не для программирования, а для описания/разработки?
Понял-то понял, но вижу в этом мало смысла.

 Профиль  
                  
 
 Re: Эффективное изложение информации
Сообщение30.03.2021, 06:41 


12/07/15
2956
г. Чехов
1. Язык разработки (не путать с ЯП) предназначен для описания не только исходного кода. Непосредственно сам исходный код прекрасно описывается ЯП, и ЯП как язык для компилятора и IDE вполне пригоден.
Однако программист по факту не приспособлен анализировать исходный код на ЯП, он мучается в агонии абстракций. Существует ряд методологий и методик абстракций и написания хорошего кода, которые до сих пор реализуются разработчиками вручную. По факту имеется тенденция поддержки абстракций со стороны IDE, однако этого по-настоящему похоже никто не осознал. В итоге каждый разработчик имеет дело с ЯП, но незаметно для собственного самоанализа переводит исходный код на свой внутренний неформализованный язык разработки.
Это первый пункт, для которого я придумал язык абстрактных списков и множеств.

2. У исходного кода есть окружение, о котором программист имеет некоторое понятие. В отличие от исходного кода описание окружения неформализовано. Есть рекомендации записывать знания об окружении и положении исходного кода в этом окружении в комментариях программы. Но так как здесь все нечетко, то рекомендации плохо исполняются. Более того, сами рекомендации избегают жестких требований по той же причине, что их сложно соблюдать. Я тут пытаюсь навести порядок.
Окружение каким-то сложным образом представлено в голове разработчика опять же на его языке разработки.
Для описания окружения нет анализируемого языка (компилятору окружение неинтересно по определению, а для IDE пригодился для целей CAD).

В итоге язык разработки нужен для удобного чтения исходного кода, а также для обмена знаниями между разработчиками и поддержки со стороны IDE.

А вы говорите:

arseniiv в сообщении #1512072 писал(а):
вижу в этом мало смысла.


Может быть дело не в цели и назначении языка, а в его реализации?

 Профиль  
                  
 
 Re: Эффективное изложение информации
Сообщение30.03.2021, 17:44 


08/11/12
140
Донецк
Mihaylo, не об UML ли вы говорите? И если нет, то что вас не устраивает в UML в плане вашей задачи?

 Профиль  
                  
 
 Re: Эффективное изложение информации
Сообщение31.03.2021, 05:12 


12/07/15
2956
г. Чехов
Ну да, это же тоже язык разработки (и язык программирования). UML можно использовать таким же образом, как предлагаю я, а именно: описывать окружение. Сейчас диаграммами UML описывают разрабатываемый код, и изредка описывают процессы в окружении кода. Проблема в том, что окружение часто трудно описать с помощью внятного конечного автомата или другой диаграммой. Очень часто нужно и при этом достаточно описать просто наличие связи между двумя сущностями. То есть язык должен быть абстрактным.

Зачем описывать окружение? Чтобы IDE мог соучаствовать в разработке. Я выше описывал XY-навигатор по коду. Навигатору не хватает элементарных знаний об окружении, чтобы помогать в навигации.

Итого, чего не хватает UML:
1. Абстрактности? Ну думаю чуть-чуть добавить многоточий (...) как я сделал для обычного ЯП, то все получится.
2. Использовать его не только для описания кода.
3. Интегрировать описания окружения в IDE.

Позже составлю пример описания окружения (например, библиотека функций/классов ЯП + операционная система). И опишу, как навигатор может использовать это описание. Нужен какой-то пример уровня "Hello, world!".

 Профиль  
                  
 
 Re: Эффективное изложение информации
Сообщение06.04.2021, 10:38 


08/11/12
140
Донецк
Mihaylo в сообщении #1512207 писал(а):
Итого, чего не хватает UML:
1. Абстрактности? Ну думаю чуть-чуть добавить многоточий (...) как я сделал для обычного ЯП, то все получится.
2. Использовать его не только для описания кода.
3. Интегрировать описания окружения в IDE.


1. Куда уж абстрактнее? UML не привязан ни к какому языку программирования. Смоделировав систему на UML, можно реализацию сделать хоть на Java, хоть на C++, хоть на Pithon. Уровнем абстракции модели управляет разработчик модели. Хотите - нарисуйте модель на уровне взаимодействия функциональных модулей, хотите - пропишите до уровня описания алгоритмов реализации методов.
2. А почему вы решили, что UML только для описания кода? Use case диаграммы, например, вообще с кодом плохо соотносятся. Никто не мешает на UML построить модель электрокофеварки (без микроконтроллерного управления :), например.
3. Ну, например в VS Code есть расширение draw.io, которое позволяет в проекте рисовать диаграммы, в т.ч. и UML. Причем объекты диаграмм можно связывать с кодом. Т.е. на диаграмме кликаешь на элемент класса и IDE открывает файл исходника с определением этого класса, например.

 Профиль  
                  
 
 Re: Эффективное изложение информации
Сообщение07.04.2021, 07:26 


12/07/15
2956
г. Чехов
Это все понятно, с UML. Есть отдельные инструменты, без которых никуда и которыми можно все, а можно и без них.

Я же ратую за эффективность работы разработчика с синтезируемой системой. Я предлагаю всегда описывать то, что иногда описывают в силу сложности понимания и простоты формализации. Если же объект формализации плохо поддается, то описание не делается. Если же что-то простое, то тоже отпадает смысл описывать ("ну и так же все понятно"). Я вижу причины, почему всегда нужно делать описания окружения. Потому что эти описания можно интегрировать с кодом для получения целостной картины, которая резко меняет возможности IDE-поддержки. Эта поддержка не заключается в "кликнул на квадратик UML - открылся код", немного другое.

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 50 ]  На страницу Пред.  1, 2, 3, 4  След.

Модераторы: Karan, Toucan, PAV, maxal, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group