НовостиСобытияКонференцииФорумыIT@Work
Идеи и практики автоматизации:

Блог

Нужно ли бороться за эффективность программного кода? В каких случаях и зачем? Как? 2.0

Андрей Колесов
06.12.2012 13:05:24

В заголовке поста указана версия 2.0, поскольку пост с таким названием уже был опубликован в понедельник, но несмотря состоявшуюся там полезную дискуссию, разговора по собственно этому вопросу там, на мой взгляд, не состоялось. А вопросы мы представляются важными, без ответа на них рассматривать конкретные методы повышения эффективности кода, по большому счету, вообще не имеет смысла.

А именно такое "методы повышения" будут в центре внимания вебинара "“Как с помощью инструментария разработчика сделать программный код эффективным”, подробнее о теме и зарегистрироваться – тут, который состоится в день "тройных чисел" – 12.12.12, но в 11:00.

К сожалению, по организационно-техническим причинам презентеры (слово хотя и новое, но мне видится оно лучше отражает суть дела, чем "спикеры") из Нижегородского исследовательского центра Intel – Галина Санжарлинская, Екатерина Антакова



– не могут напрямую поучаствовать в наших блог-дискуссиях.
Но все же по почте им удалось прислать мне послание – они следят за нашими разговорами и обещают: "Все вопросы относительно технических возможностей повышения эффективности кода с помощью программных инструментов Intel, приведенные в комментариях, мы постараемся прокомментировать в ходе вебинара".

Что ж, это отрадно…

Мой тезис по теме остается прежним: эффективность кода должна быть оптимальной. А именно: уровень эффективности – некий компромисс между целовой бизнес-задачей и затратами на повышение эффективности.

Пример из уже довольно далекой программистcкой жизни.

В 1989-91 гг. в рамках собственной разработки прикладного ПО для IBM PC AТ на QuickBasic сделал набор библиотек для пользовательского интерфейса (окна, меню, и многое другое). Которые сначала использовал "для себя", а потом преобразовал в коммерческий продукт (Kolesov QB Tools – "Повоем на луну Basic-DOS".

Сначала все это работало в текстовом режиме экрана (поди, и не помнит никто, что это такое), но все же – графика. Кстати, вот запустил рекламную демо: работает!



Это то, что мы тогда видели на полном экрана монитора (14 дюймов, 80*25 символов). Немного посмотрел – самому дурно стало – сколько же кода тогда было написало! А ведь это – только капля от написанного тогда).

Так вот. Поначалу вся графика была написана на самом QB. По началу, все это вполне устраивало (а уж по сравнению с командной строкой, казалось просто фантастикой). Но когда привыкли к "оконным инновациям", скорость рисовки стала несколько утомлять. Не сказать, что это мешало работе пользователя (а поначалу это был я сам), но все же то, что процесс рисования был заметен – несколько раздражало.

Встал вопрос – как ускорить.
Средства Интел тут не помогли бы. По двум причинам: 1) было понятно, что простая оптимизация компилятору тут не поможет 2) никаких средств от Интела не было и в помине.

Нужны были меры организационно-алгоритмически-технологического характера.
1) Поменять язык (это и не помогло бы)
2) поменять алгоритмы (тоже не вариант – все уже было "вылизано")
3) делать что-то еще

Простой вариант – это использовать для рисовки функции BIOSа. В QB такие возможности были, что я и сделал.
Было получено отличное ускорение, скорость была "вполне" – глазом процесс рисовки стал не виден.

Но что-то там было все же не очень хорошо. Сейчас уже точно не помню, но кажется, выявились две проблемы
Через БИОС была доступны не все нужные для графики функции.

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

Короче говоря, функции вывода графики были переписаны на Ассемблере. И на этом все закончилось – все стало работать еще быстрее (по сравнению с БИОС) и вполне устойчиво.

НО!

Объем кода на Ассемблере в начальном варианте QB Tools составлял не более 1-5% от общего кода. По мере расширения функционала эта доля быстро приближалась к нулю (как было 5-10 подпрограмм, так и осталась).
Трудоемкость написания на Ассемблере была раз в 10-100 больше чем на QB. Объем кода был небольшой, а повозиться пришлось. К тому же там нужно было вносить кое-какие расширения.

А дальше было вот что. В 1994 году я приобрел свой первые персональный ПК (НИИ не мог купить, его устраивали AT) – 486DX. Таких тогда мало в России еще было.

И выяснилось, что Ассемблеровский вариант графики (текстовой, по крайней мере) для 486DX не нужен. Я стал на свой ПК работать с QB-графикой (так было проще делать компоновку загрузочного модуля, все же смешанное программирование – это некоторые неудобства…). А клиентам продавал (да, уже пошли продажи!) вариант в ASM – они работали на AT и XT.
А через пару лет и им стал компоновать с QB – они тоже перешли на более мощные ПК.

Вот такая история о том, нужно бороть за эффективность код. Зачем и как…

========

P.S. Чтобы уж логично закончить мемуары, приведу тут два варианта процедур "сохранения-вывода фрагмента экрана на BAS и ASM

Код
DECLARE SUB WNKstore (irow%, icol%, idr%, idc%, a$, kod%)
DEFINT I-N
'***********************************************************
'************ K o l e s o v   Q B   T o o l s **************
'*         БИБЛИОТЕКА подпpогpамм QB_WNK  v.2.87           *
'* поддержка оконного интерфейса в текстовом режиме экрана *
'***********************************************************
'*                Модуль WNK_BAS.BAS                       *
'*           Процедуры работы с видеопамятью               *
'*---------------------------------------------------------*
'*    Альтернативный вариант модуля WNK_ASM.BAS            *
'*            - вывод средствами BASIC                     *
'***********************************************************
'==========================================================
'======================    ВНИМАНИЕ: ======================
'    Процедура WNKstore использует обращение к подпрограммам,
'    написанным на ассемблере:
'      CopyScrBox  - вариант для QuickBASIC v.4.0
'      CopyScrBox7  - вариант для BASIC v.7.0
'    Необходимо исправить непосредственно текст процедуры WNKstore
' для использования одной из этих подпрограмм.
'
'  ============  СЕЙЧАС текст соответствует v.4.0 ==================
'
'    При работе в среде QB необходимо создать
' двоичную библиотеку .LIB, .QLB
' (см. текст модуля WNKVIDEO.ASM) и загружать:
'
'        QB.EXE /L WNKVIDEO
'============================================================
'   СОСТАВ ПРОЦЕДУР МОДУЛЯ:
'    WNKstore - сохранение/восстановление окна
'    WNKshadow - вывод "тени" под окно
'    WNKscreen0 - установка активной и видимой страницы
'   **********************
'     Общие формальные параметры:
'     ---------------------------
'   irow, icol    - координаты левого верхнего угла окна (строка, колонка)
'   idr, jdl      - размеры окна (строк, колонок)
'-------------------------------------------------------------------
' сохранение/восстановление окна:
'  Call WNKstore (irow, icol, idr, jdl, a$, kstore)
'   - " -
'   a$    -  симв. переменная для хранения изображения окна (рабочий буфер)
'   kstore = 0 - чтение "окна" (сохранение)
'          = 1 - восстановление
'-------------------------------------------------------------------
' вывод "тени" под окно:
'   CALL WNKshadow(irow, icol, idr, jdl, Kft, Kbt)
'    Kft,Kbt - цвета тени
'-------------------------------------------------------------------
' определение активной и видимой странцы:
'   CALL WNKscreen0 (Apage%, Vpage%)
'     Apage%, Vpage% - номера активной и видимой странцы
'                      видеопамяти (0-7)
'***********************************************************************
     DIM SHARED Offset%
END

SUB WNKscreen0 (Apage%, Vpage%)
'
'    Установка параметров режима SCREEN 0
'  (это нужно для установки адресов видеопамяти)
'    Apage% - номер активной старницы
'    Vpage% - номер видимой старницы
'------------------------------------------------
     SCREEN 0, , Apage%, Vpage%
     Offset% = 4096 * Apage%        ' смещение видеопамяти
END SUB

SUB WNKshadow (irow, icol, idr, idc, Kft, Kbt)
'     вывод "тени" под окно
'    Kft,Kbt - цвета тени
''''''''''''''''''''''''''''''''''''''''''''
'  код атрибутов цвета тени:
   Kct = (Kft AND 15) + (Kbt AND 7) * 16
' --------------------------------------------------
'  вариант с модулем WNK_ASM.ASM:
'   CALL ModifyAtr(irow + 1, icol + idc, idr, 2, Kct)
'   CALL ModifyAtr(irow + idr, icol + 2, 1, idc - 2, Kct)
' --------------------------------------------------
'  вариант на QB:
   DEF SEG = &HB800
   ik = irow * 160 + (icol + idc - 1) * 2 + 1 + Offset%
   FOR i = 1 TO idr: POKE ik, Kct: POKE ik + 2, Kct: ik = ik + 160: NEXT i
   ik = (irow + idr - 1) * 160 + (icol) * 2 + 3 + Offset%
   FOR i = 3 TO idc: POKE ik, Kct: ik = ik + 2: NEXT i
   DEF SEG
END SUB

SUB WNKstore (irow, icol, idr, idc, a$, kod)
'    ****  сохранение/восстановление картинки окна
'   irow, icol    - координаты левого верхнего угла окна (строка, колонка)
'1)   kod = 0 - чтение "окна" (сохранение)
'      Вход:   idr, idc      - размеры окна (строк, колонок)
'      Выход:  a$  -  симв. переменная для хранения изображения окна
'2)   Kod  = 1 - восстановление
'      Вход:  a$  -  симв. переменная для хранения изображения окна
'      Выход:   idr, idc      - размеры окна (строк, колонок)
'***********************************************************************
'
   IF kod = 0 THEN     ' сохранение окна
     a$ = CHR$(idr) + CHR$(idc) + SPACE$(idr * idc * 2)
   ELSE idr = ASC(a$): idc = ASC(MID$(a$, 2, 1))
   END IF
'-----------------------------------------------------
'    вариант с модулем WNK_ASM.ASM:
'  CALL CopyScrBox(SADD(a$)+2, irow, icol, idr, idc, kod)
'-----------------------------------------------------
'    вариант на QB:
   DEF SEG = &HB800
   k = 3: ik0 = (irow - 1) * 160 + (icol - 1) * 2 + Offset%
   FOR i = 1 TO idr
     ik = ik0
     FOR j = 1 TO idc
       IF kod = 0 THEN
         MID$(a$, k, 1) = CHR$(PEEK(ik))
         MID$(a$, k + 1, 1) = CHR$(PEEK(ik + 1))
       ELSE
         POKE ik, ASC(MID$(a$, k, 1)): POKE ik + 1, ASC(MID$(a$, k + 1, 1))
       END IF
       k = k + 2: ik = ik + 2
     NEXT j
     ik0 = ik0 + 160
   NEXT i
   DEF SEG
END SUB

SUB WnkStorePage (Page$, kod)
'
'  запоминание (Kod=0)/восстановление (=1) тек. активной страницы
    CALL WNKstore(1, 1, 25, 80, Page$, kod)
END SUB


;**********************************************************
;************ K o l e s o v   Q B   T o o l s *************
;*         БИБЛИОТЕКА подпpогpамм QB_WNK  v.2.87          *
;**********************************************************
;*                Модуль WNKVIDEO.ASM                     *
;*--------------------------------------------------------*
;*    Подпрограммы прямого обращения к видеопамяти в      *  
;*        текстовом режиме экрана - SCREEN 0              * 
;*    для цветного монитора - CGA, EGA, VGA               *
;**********************************************************
;             Внешние процедуры:
;             ------------------
;  CopyScrBox - чтение/запись фрагмента экрана в символьную
;               переменную (переменная резервируется в вызывающей
;               программе) - вариант QB v.4.0
;  CopyScrBox7 -  - " - вариант QB v.7.0
;  ModifyAtr  - изменение атрибутов цвета фрагмента экрана
;
;  ActiveVideoPageSet0  - установка адреса активной видеостраницы
;
;  ************************************************
;             Внутренние процедуры:
;             ---------------------
;  GetScrParam - обработка входных параметров
;***************************************************************
;  ОБРАЩЕНИЕ:
;---------------------------------------------------------------
;   CALL CopyScrBox(offset%, irow%, icol%, idr%, idc%, kod%)
;          вариант QB v.4.5. 
;       kod = 0  - чтение фрагмента видеопамяти
;           = 1  - восстановление - " -
;       irow%, icol% - координаты левого верхнего угла
;                    (строка и столбец)
;       idr%, idc% - размеры фрагмента (по вертикали и горизонтали)
;       offset% = SADD(a$) - адрес символьной переменной (смещение)
;       ------------------
;   CALL CopyScrBox7(Ssegadd&, irow%, icol%, idr%, idc%, kod%)
;          вариант QB v.7.0. 
;       Ssegadd& = SSEGADD(a$) - адрес символьной переменной (полный)
;---------------------------------------------------------------
;   CALL ModifyAtr( irow%, icol%, idr%, idc%, atribut%)
;       atribut% - новый атрибут (цвет символа)
;---------------------------------------------------------------
;   CALL ActiveVideoPageSet0(Apage%) - установка адреса активной видеостраницы
;       Apage% - номер видеостаницы (0-7)
;***************************************************************
;         ПРИМЕРЫ ПРИМЕНЕНИЯ:
;***************************************************************
;    SCREEN 0        ' По умолчанию (после загрузки программы)
;                    ' - работа с 0-й видеостраницей
;    ...
;        'запоминание фрагмента
;    buffer$=SPACE$(idr%*idc%*2) ' резевируем переменную
;    CALL CopyScrBox(SADD(buffer$),irow%,icol%,idr%,idc%,0)
;    ...
;        'восстановление фрагмента
;    CALL CopyScrBox(SADD(buffer$),irow%,icol%,idr%,idc%,1)
;    ...
;    ' изменение атрибутов цвета:
;    '  Kfore, Kback - цвет символа и фона
;    atribut%=(Kfore AND 15) + (Kback AND 7) * 16
;    if Kfore>15 then atribut%=atribut%+128
;    CALL ModifyAtr( irow%, icol%, idr%, idc%, atribut%)
;  '
;  ' после переопределения активной видестраницы необходимой
;  ' обратиться к процедуре ActiveVideoPageSet0, например:
;    SCRREN 0, , 3, 2      '  3 - активная видеостраница, 2 - видимая
;    CALL ActiveVideoPageSet0(3)
;    ...
;  Создание библиотеки:
;  ====================
;         MASM.EXE  WNKVIDEO.ASM;
;         LIB.EXE  WNKVIDEO.LIB + WNKVIDEO.OBJ;
;4.5:
;         LINK /Q  WNKVIDEO.LIB,WNKVIDEO.QLB,,BQLB45.LIB;
;7.0:   
;         LINK /Q  WNKVIDEO.LIB,OUTVIDEO.QLB,,QBXQLB.LIB;
;
;   Для использования подпрограмм в среде QuickBASIC
;   загрузите:
;         QB.EXE /L WNKVIDEO.QLB
;********************************************************

.MODEL MEDIUM
.DATA
;      координаты фрагмента:  нумерация с НУЛЯ !
idr      db ?    ; кол-во строк
idc      dw ?    ;  кол-во столбцов
StrSeg   dw ?    ; адрес сегмента символьной строки (или откуда копируем - DS)
Aoffset  dw 0    ; смещение видеопамяти: по умолчанию 0-я страниница
.CODE
;
GetVideoSeg Proc     ; определение сегмента видеопамяти
        mov     ah,0Fh
        int     10h                     ;INT 10H fn. 0Fh - Get Video Mode
        mov     ax,0B800h    ;assume COLOR screen for now
        cmp     al,07h                  ;is it MONOCHROME mode?
        jne     arnd1
        mov     ax,0B000h    ;yes, set for mono screen seg
arnd1:  mov     es,ax        ; адрес сегмента видеопамяти
        ret
GetVideoSeg endp
;
CopyScreenBox Proc  near  ; обмен c видеопямятью   
        mov    StrSeg,ax    ; адрес сегмента символьной строки
        mov    si,[di]    ; смещение
        call GetVideoSeg    ; определение адреса сегмента
        mov    di,[bp]+6   ;  получаем код операции
        mov    dh,[di]
        mov    dl,0      ; обнуляем - признак операции CopyScrBox
        call PutVideo     ; перезапись в видео память
        ret
CopyScreenBox endp
;       перезапись в видеопамять
PutVideo proc near
;    определение координаты фрагмента
        mov    di,[bp]+14  ; Irow
        mov    al,[di]
        dec    al
        mov    bl,80
        mul    bl            ; AX - адрес строки
        mov    di,[bp]+12   ; Icol
        mov    bx,[di]
        dec    bx
        add    ax,bx        ; смещение в строке
        add    ax,ax
        add    al,dl        ; смещения для вывода атрибутов
        add    ax,Aoffset    ; адрес видеостраницы
;
     ;  установка счетчиков
        mov    di,[bp]+10   ; idr - длина по вертикали
        mov    cl,[di]
        mov    idr,cl
        mov    di,[bp]+8    ; idc - длина по горизонтали
        mov    cx,[di]
        mov    idc,cx
        xor    bl,bl        ; обнуление счетчика по вертикали
;     сейчас:
;  ax - смещение видеопамяти
;  es - адрес сегмента видеопямяти (приемник)
;  StrSeg - адрес сегмента строки (источник)
;  si - смещение строки (источник)
;  Для операции GetBox надо поменять адреса источника и приемника
        cmp    dl,0        ; вывод атрибутов?
        jne    next      ; да, CopyAtr
;         копирование экран - подготовка адресов
;         ds:si (откуда) ->  es:di (куда) 
        cmp    dh,0    ; 0 - Get   
        jne    next    ; PutBox: строка -> экран, ничего не меняем
;   Get:  экран -> строка   : все меняем местами        
        mov di,si       ; di - смещение в симв. строке
        mov cx,StrSeg   ; адрес сегмента строки
        mov StrSeg,es   ; адрес сегмента видеопамяти!
        mov es,cx       ; копируем в строку!  
;
;         пересылка фрагмента
next:      
        ; вывод одной строки
        mov    cx,idc      ; длина строки экрана
        cmp    dl,0        ; вывод атрибутов?
        je     CopyBox     ; нет, копирование экрана
;   вывод строки атрибутов 
        mov    di,ax       ; смещение видеопамяти в DI
next_str:
; вывод очередного байта
        mov   es:[di],dh   ; да, DH - код атрибута
        add di,2          ; увеличиваем адрес видеопамяти
        loop   next_str    ;не последний символ в сроке?
        jmp GO_ALL         ;переход к след. строке экрана
;
;     пересылка строки
CopyBox:
        cmp    dh,0    ; 0 - считать   
        je     GetBox  ; да
PutBox: mov di,ax   ; <>0 - восстановить: строка -> экран
        jmp GO_BOX    
GetBox:
        mov si,ax   ; экран строка
GO_BOX:      
        push    ds
        mov ds,strseg     ; адрес сегмента источника
        rep movsw
        pop ds          ; восстановить DS
;
; обработка след. строки
GO_ALL:
        add    ax,160       ; адрес следующей строки
        inc    bl
        cmp    bl,idr   ; последняя строка?
        jne    next    ; нет
;
        ret
PutVideo endp
;
        public CopyScrBox  ; обмен с видео пямятью - v.4.5. 
CopyScrBox  proc
        push   bp
        mov    bp,sp
        mov    di,[bp]+16 ; адрес симв. переменной
        mov    ax,ds      ; адрес сегмента данных
        call CopyScreenBox   ; обмен данными
        pop bp
        ret 12
CopyScrBox  endp
;
        public CopyScrBox7  ; обмен с видео пямятью - v.7.0. 
CopyScrBox7  proc
        push   bp
        mov    bp,sp
        mov    di,[bp]+16 ; адрес симв. переменной
        mov    ax,[di+2]      ; адрес сегмента данных
        call CopyScreenBox   ; обмен данными
        pop bp
        ret 12
CopyScrBox7  endp
;
;
         public ModifyAtr  ; программа изменения атрибутов
ModifyAtr proc
         push  bp
         mov   bp,sp
         call GetVideoSeg    ; определение адреса сегмента
         mov    di,[bp]+6   ;  получаем код атрибута
         mov    dh,[di]
         mov    dl,1      ; 1 - признак операции ModifyAtr
        call PutVideo     ; перезапись в видео память
        pop    bp
        ret   10
   ModifyAtr   endp
;
        public ActiveVideoPageSet0
ActiveVideoPageSet0 proc       ; определение активной видеостраницы
        push   bp
        mov    bp,sp
        mov    di,[bp]+6
        mov    bx,[di]         ; номер видеостраницы
        mov    ax,4096
        mul    bx
        mov    Aoffset,ax
        pop    bp
        ret    2
ActiveVideoPageSet0 endp

        end

Комментариев: 11

Только зарегистрированные и авторизованные пользователи могут добавлять комментарии

07.12.2012 17:12:53

Эффективный код - это что? Из контекста вроде бы ясно, что это, по-твоему, быстрый код. Так? Я считаю, что это невернр. Для очень многих приложений, да что там, для абсолютного большинства, скорость абсолютно неважна, важно, чтобы они приносили пользу людям. Эффективность кода измеряется: 1) скоростью написания и отладки; 2) надежностью (число ошибок, выявленных уже в эксплуатации, на 1000 строк кода); 3) понятностью, легкостью в сопровождении (надо - формализую). В полном соответствии с http://lib.mexmat.ru/books/62312.

Правильность моего подхода подтверждается, во-первых, ходом истории. Разработка ПП сегодня - погоня не за быстродействием, а за пользователем, за его нуждами\причудами\модой, важно быстро дать продукт, а как быстро он будет работать - плевать, железо, как стало окончательно ясно с появлением Windows CE, если не раньше, вытягивает _любой_, самый прожорливый софт, т.к. з-н Мура никто не отменял. Оптимизирующие компиляторы Intel - то же, в сущности, что и рост мощности кристаллов, тот же принцип: "программист, думай о том, чтобы код правильно работал, а о скорости мы позаботимся".

Во-вторых, правильность моего суждения отлично демонстрирует твой код. Он - не нужен, во всяком случае, он точно не был нужен году к 87-му, а то и раньше. Бэйсик, даже Quick, сколько бы ни прикидывался приличным языком, для создания полезных людям продуктов подходил плохо: порочная тяга к goto, отсутствие развитых средств создания структур данных и неприспособленность к нисходящему программированию. Я знаю, что ты скажешь - компилятор, мощный язык, от бэйсика одно название. На это я скажу - посмотри, сколько QB существовал и чем кончил. До объектной ориентации так и не дошло, хотя без нее гораздо хуже, чем с ней.

Программист, желавший в те далекие годы создать полезный продукт _на продажу_, о QB думал в последнюю очередь, если вообще вспоминал. Я не затеваю холивар, я о другом: выбор средства зависит от задачи. QB был неплох для инженеров, учивших некогда Бэйсик, и вдруг увидевших IBM PC. QB - средство самогоноварения, программирования "тильки для сэбе". Но если тебе нужен был отчуждаемый продукт, ты выбирал что-то другое, причем не обязательно (и даже не часто) универсальный язык. VB и VBA - другое дело и другая тема.

Как-то так. В общем, если хочешь писать эффективный код - читай Йодана, Вирта и Дейкстру. Если вдруг задача требует эффективной алгоритмизации типичных процедур обработки данных (сортировка, поиск - не представляю, зачем, но вдруг) - тебе к Кнуту. А ассемблер учи, если пишешь драйверы. Тоже полезное занятие, но мы не о нем, правда?

08.12.2012 19:41:27

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

Цитата
Эффективность кода измеряется: 1) скоростью написания и отладки; 2) надежностью (число ошибок, выявленных уже в эксплуатации, на 1000 строк кода); 3) понятностью, легкостью в сопровождении (надо - формализую). В полном соответствии с http://lib.mexmat.ru/books/62312.


Если уж дается ссылка на классика (речь идет о книге Э.Йодана - сейчас его фамилия по-русски пишется обычно "Йордан" - "Структурное проектирование и конструирование программ", кстати, один из двух ее переводчиков - Л.А.Теплицкий, генеральный директор издательства СК Пресс, куда входит и PC Week, со дня его основания), то было бы хорошо дать точные цитаты оттуда.

Но я понимаю, почему ты ее не дал - в книге нет определения "эффективный код". Там вообще не говорится про эффективный код (быстродействие, память). Там говорить о "хорошей программе" (глава первая). А "хорошая" и "эффективная" - все же совсем не одно и то же.

Что касается, рассуждение о QB, то они говорят лишь о том, что ты не знаком с этой системой. Переубеждать в неверности твоих представление не имеет смысла, потому, что QB уже давно не применяется (он был по ДОС), потому что ты уже давно не программируешь, а про то, что на самом деле представляет собой QB - написано давным-давно.

Незнание того, что такое QB, уже хотя бы потому, что ты не курсе того, что QB, обладая очень хорошими возможностиями по создания эффективного года (не хуже других языков программирования), был безусловным чемпионом как раз по эффективности разработки. Я уже говорю о том, VB - это, в общем-то, как раз продолжение QB, причем -- по многим позициям уступал QB даже в своих последних версиях.

Что касается, совета "читать Иодана" и других, то, я их не только читал и применял эти рекомендации в своей работе, но много писал про эти книги. Давно, еще лет 15 назад. А сами книги - стоят на полке, рядом с монитором.

Еще в 2000 года я написал серию статей под названием "Поговорим о программировании
Размышления бывшего программиста"
. В первой статье
(http://www.visual.2000.ru/develop/talks/talks1_1.htm)
есть отдельный совет: "О пользе чтения книг по программированию".
Там приведен списком для "обязательного чтения":

Цитата
Ф. Брукс "Как проектируются и создаются программные комплексы. Мифический человеко- месяц" / М.: "Наука", 1979.
Э. Дейкстра "Заметки по структурному программированию" (в составе сборника "Структурное программирование" / М.: "Мир", 1975.
Э. Йордан "Структурное проектирование и конструирование программ" / М.: "Мир", 1979
.

А этот комментарий нужно закончить советом: если берешься судить о системе программирования, то, если уже не работать с ней, то хотя бы почитать о ней, стоило бы.

10.12.2012 14:45:03

Андрей, я никому не давал советов, это твоя вольная интерпретация. Повелительное наклонение ("читай") - фигура речи, а не совет/ Напротив, я, как ты знаешь, не хотел здесь ничего комментировать, полагая достаточной беседу в FB, и здесь появился по твоей просьбе.

Причина такой скромности тобою указана верно: давно не зарабатываю на жизнь программированием, поэтому в эксперты не гожусь, а мемуары отставного ветерана движения никому, кроме таких же ветеранов, не интересны )

Однако вынужден отвечать за базар.

Ты цепляешься к словам. термин "эффективность" ты не определил, а я не лазил за дефиницией в книжки, просто взял на себя труд сделать это и изложить свое суждение. Добавить мне нечего, тем более, что ты суть сказанного и не оспариваешь. Еще раз: смешно тратить неделю работы ради экономии пары миллисекунд в середине очень короткого цикла (цитата из Йодана;;позволь уж мне писать его фамилию по-русски так, как Теплицкий написал на обложке).

Если непонятно, то вот ответ на твой вопрос в максимально простом виде: нет, не нужно бороться за быстродействие ("эффективность", по-твоему) кода. Если ты создаешь прикладной программный продукт, быстродействие обязано вытянуть "железо" и правильно написанный компилятор. А программисту, если он не дурак, есть о чем подумать кроме такой ерунды, как быстродействие.

Ты пишешь о собственной начитанности и собственных же текстах, Извини, на эту провокацию я не поддамся и не стану перечислять в ответ все прочитанное, написанное и отлаженное мною, чтобы громче тебя бряцать заржавевшими программистскими доспехами. Это было бы, как мне кажется, смешно. Процитирую только Мишу Донского (по памяти), надеюсь, он для тебя, как и для меня, непререкаемый авторитет: "Программист работает на корзину. Ты можешь написать лучший в мире код, и он завтра никому не будет нужен. Так и у журналиста: где твои вчерашние статьи?"

Соблазн поговорить об инструментарии, конечно, велик. с трудом преодолеваю ) В свое время прежде, чем садиться за клавиатуру, думал не только о структуре кода или данных, а, прежде всего, о том, чем стану делать _это_,. Часто такие размышления были мучительны, а иногда заканчивались очень глупо: так, обработку и индексацию файлов dbf предпочел написать на Паскале, чтобы не лишаться возможностей создания нормального интерфейса пользователя, и на данных серьезного объема столкнулся с тем, с чем и должен был ) Компиляторы Quick были мною изучены и забракованы по причине существенно менее удобной IDE Что это было правильно, вскоре подтвердилось - MS отказалась от их поддержки, а предпочтенные мною компиляторы Borland жили долго и от версии к версии становились все лучше.

Спасибо, кстати, Borland за разрешение советским (росс.) программистам продавать продукты, отлаженные на ворованных компиляторах, других-то не было. Не помню, разрешала ли это MS.

10.12.2012 23:55:16

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

11.12.2012 12:22:59

Хотел бы - ответил. Для разговора по существу в моем посте все есть. Мог бы сказать: неееет, надо, обязательно надо экономить пару миллисекунд в середине очень короткого цикла!

Ладно, закончили. Я удовлетворен.

Тому, кто программировал этот онлайн-ресурс, надо оторвать руки - с этим-то ты согласен? )

11.12.2012 14:19:38

В моем посте, по существу, вроде бы тоже все есть.
Я напишу сейчас продолжение в следующем посте.

Что касается "кто программировал", то ты кажется знаком с Сергеем Рыжиковым?
Можешь, делать с ним "как надо"...

11.12.2012 17:01:29

Подставляешься, Андрей ) Он платформу сделал, а за дизайн сайта pcweek отвечать не может.

Но я не за этим вернулся. Вот, посмотри: http://flibusta.net/g/comp_programming/Pop По-моему, это поучительно.

11.12.2012 17:46:31

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

11.12.2012 17:48:01

А что там поучительного?

11.12.2012 23:26:14

Разве не поучительно посмотреть, что читают современные программисты? У меня сложилось впечатление, что они стремятся как можно быстрее написать работающий (а не быстро работающий) код, и это правильно. Хотя Кнут все еще в почете )

Андрей, сорри, я сожалею о том, что влез сюда с комментариями, и больше в беседе не участвую. Тема никого, кроме нас с тобой, не интересует. Пока )

11.12.2012 23:41:11

А что тут удивительного? Разработка ПО всегда выполнялась в виде решения двух последовательных задач.
Первоочереденая, обязательная - написать работающий код
Вторая, по мере необходимости, - повысить его эффективность.

Если ты прочитаешь пост, написанный в начале этой ветки, то увидишь, что приведенный мной пример разработки 20летней давности как раз иллюстрирует ровно этот подход.

А после этого посмотри на заголовок поста: так как раз задает вопрос - "нужно ли бороться за повышение эффективности кода?" Точнее так: до каких пределов нужно бороться и какими методами.

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

Они как раз исходят из базового тезиса - "повышать эффективность НУЖНО". А я их хочу как раз спросить - "нужно ли?"

Как ты уже, наверное, понял, мы в этом вопросе - союзники, а не противники, как тебе показалось.

Короче говоря: подключайся завтра (уже через 11 часов 22 минуты) к вебинару и давай вместе поспрашиваем барышень о том, как нужно вести разработку ПО.

Что касается "никто, кроме нас с тобой не интересует", то тут ты, думаю, ошибаешься. Я точно знаю еще одного, который пишет мне комментарии в письмах. Трое - это уже достаточно для многих серьезных дел smile:)

Только зарегистрированные и авторизованные пользователи могут добавлять комментарии