Sub GetFriendFile()
'DESCRIPTION: Opens the corresponding .h / .cpp file
Dim currentFileName As String
Dim newFileName As String
currentFileName = Application.ActiveDocument.FullName
newFileName = ""
If (UCase(Right(currentFileName, 2)) = ".H") Then
newFileName = Left(currentFileName, Len(currentFileName) - 2) + ".CPP"
ElseIf (UCase(Right(currentFileName, 4)) = ".CPP") Then
newFileName = Left(currentFileName, Len(currentFileName) - 4) + ".H"
End If
If newFileName <> "" Then Application.Documents.Open(newFileName)
End Sub
Для того чтобы его использовать идете в Tools | Macros | Macros IDE появится новое окно в котором будет открыт MyMacros проект. Добавьте новый модуль, назовите его скажем Switch2cpp. И далее вставьте в него функцию GetFriendFile, сохраните и затем назначьте сочетание клавиш.
Для этого выберите Tools|Options|Environment|Keyboard и там выберите из лист бокса Macros.MyMacros.Switch2cpp.GetFriendFile и сочетание клавиш, которые будут выполнять данный макрос, после этого не забудьте нажать кнопку Assign - наслаждайтесь.
function vFrmUnsubscribe(form)
{
total = form.length;
var errorMsg = new Array("Please enter a valid Email Address.",
"","","","","","","");
for(var i = 0; i < total; i++)
{
if(i == 1 || i == 2 || i == 3 || i == 4 || i == 5 || i == 6 || i == 7)
{
continue;
}
if(i == 0)
{
if(form.elements[i].value == "" || form.elements[i].value.length<1)
{
alert(errorMsg[i]);
form.elements[i].focus();
return false;
}
if(!vEmail(form, i))
{
form.elements[i].focus();
return false;
}
}
if(form.elements[i].value == "" || form.elements[i].value.length < 1
|| form.elements[i].value == -1)
{
alert(errorMsg[i]);
form.elements[i].focus();
return false;
}
}
return true;
А вот вообще супер function isDigit(digit)
{
var charOk = "0123456789";
return !(charOk.indexOf(digit) == -1)
}
function isAlphaNumeric(digit)
{
var charOk =
"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
return !(charOk.indexOf(digit) == -1)
}
}Работает ли ваш код? С чего вы это взяли? Можете ли вы это доказать?
Если ваш код не имеет тестов, он – отстой. Я имею в виду – всесторонние, в достаточной мере детализированые программные тесты (известные также как Юнит-тесты (unit tests)), а также более высокоуровневые функциональные (functional) и интеграционные (integration) тесты. Тесты, которые автоматизированы. Тесты, которые запускаются постоянно. Включая программные тесты, запускающиеся после всякого изменения кода.
Без адекватных тестов (подразумевая – как по количеству, так и по качеству), вы просто не можете иметь уверенность в том, что ваш код работает как нужно. Задумайтесь: даже если вы сами уверены в том, что вы сделали... почему кто-то ещё должен слепо верить этому? А что вы скажете о людях, которые будут работать с вашим кодом в будущем и изменять его? Как они будут знать, что ваш код работает после изменений, выполненых позже?
Отлично, вы решили добавить тесты в ваш код. Чаще всего, это не так-то просто. Скорее всего, ваш код просто-напросто не был спроектирован и/или реализован так, чтобы его было легко тестировать. Это означает, что вам придётся делать изменения в нём, чтобы сделать его поддающимся тестированию... не разрушив никакой функциональности (собственно это в наше время и называется рефакторингом (refactoring)). Но, выполняя такие изменения, можно ли быстро и уверенно сказать, что вы ничего не сломали в работающем коде, если в нём не было всесторонних и детализированых тестов? Вряд ли. (Похоже на задачку про курицу и яйцо – прим. перев.)
На самом деле, дела обстоят ещё хуже. Если вы принимаете решение о том, что вы будете писать тесты для всего своего кода после того, как написан сам код, вам придётся приложить дополнительное усилие для того, чтобы передизайнить/переписать этот код с тем, чтобы сделать его тестируемым.
Сохранение адекватного уровня тестирования при подходе, когда тесты пишутся после самого кода, требует времени и планирования. И если вам приходится делать дополнительную работу для того, чтобы сделать код тестируемым... хм... этот код – отстой.
Написание тестов прежде написания самого кода означает, что код по определению поддаётся тестированию. Если вы отрабатываете тесты поочерёдно, вы получаете ещё больший выигрыш, поскольку каждый тест требует только инкрементальных изменений в коде, который уже проверенно работает.
Код должен быть легко читаем. Стив МакКоннелл (Steve McConnell) сказал в своём выступлении на SD West '04: код должен удобно читаться, а не удобно писаться.
Здесь следует отметить несколько факторов. Выбор хороших, говорящих сами за себя, имён – хорошее начало. Стремитесь к простым решениям, даже если они кажутся более многословными или неэффективными. Является ли эффективность проблемой, станет известно только впоследствии, при профилировании проекта в реальной ситуации использования продукта.
Выбирайте стиль и соглашения о форматировании на ранней стадии проекта, и следуйте этим соглашениям. Требуйте от других следования им же. Это будет легче сделать, если каждый внесёт свою лепту в такое соглашение. Всё это сделает ваш код единообразным и более лёгким в прочтении.
И избавляйтесь от дублирования кода во всех его проявлениях. Более подробно об этом – ниже.
Этот пункт весьма близок к предыдущему. Код может быть читабельным, но, тем не менее, труднопонимаемым. Возможно, он читается хорошо, но вводит читающего в заблуждение. Представьте: вы потратили много времени, чтобы выбрать хорошее имя переменной, но способ её использования и её значение изменились в то время, как имя осталось прежним. Это ещё хуже, чем зашифрованное имя... по крайней мере, в последнем случае, читатель знал бы, что имя бессмысленно. Но если же имя не отражает сути, читатель будет иметь беспочвенные суждения о том, что происходит в коде, что в итоге приведёт к непониманию, и в конце концов – к багам.
Например, Боб Мартин (Bob Martin) недавно поднял вопрос о догматическом использовании private полей и getters/setters для простой структуры данных (например, Data Transfer Object – DTO). Если поле прозрачно для чтения/записи, почему бы просто не сделать поле public? В большинстве языков это возможно. Конечно, в некоторых – нельзя. Например, традиционно в Smalltalk все поля (fields) являются private, а все методы – public.
Обычно хорошо, если вы можете выбросить какой-то фрагмент из кода или избежать его написания. Использование тяжёлого framework обычно требует того, чтобы вы писали значительную часть кода, который попросту не имеет никакой ценности с точки зрения бизнеса (business value).
Есть множество разнообразных лёгких frameworks для Java. Они являются ответом на тяжёлые frameworks (такие как EJB), которые в последнее время фактически стали догмой. У O'Reilly есть книга об этом, в соавторстве с Брюсом Тейтом (Bruce Tate).
Когда вы выбираете framework, предпочтите более лёгкий framework, который будет делать всю необходимую работу. Использование средств типа Hibernate, Prevayler, Spring, PicoContainer, NakedObjects, и т. д., может действительно быть выигрышным во многих случаях. Никогда не принимайте слепо тяжёлый framework только потому, что это модно сегодня. Хотя также слепо не следует выбирать и лёгкий framework. Всегда взвешивайте прежде, чем принять решение.
Дублирование – скорее всего, единственная, самая значительная вещь, которую нужно искоренить в вашем коде.
Дублирование имеет несколько форм:
Оно – самое простое и легко находимое. Когда у вас есть секции кода, которые идентичны или очень похожи. Чаще всего – это результат программирования методом copy & paste. Есть несколько способов избежать этого вида дублирования, включая: выделение методов (extracting methods) и повторное их использование (reusing), превращение метода в шаблонный метод (template method), вынос его в суперкласс (superclass) и предоставления вариантов в подклассах (subclasses), и другие базовые виды рефакторинга. Подробности см. в книге «Рефакторинг» Мартина Фаулера (Fowler's "Refactoring").
Это – особый вид текстового дублирования, когда у вас есть различные функции/методы, которые предназначены для одного и того же. Его можно часто встретить в проектах, которые разделены между группами разработчиков, недостаточно хорошо взаимодействующих друг с другом. Также, оно может быть результатом copy & paste, или просто незнания существующего кода или библиотек. Практики и полиси (practices and policies), которые стимулируют и способствуют знанию всего объёма кода и всех библиотек и frameworks, находящихся в использовании, позволяют избежать функционального дублирования.
Оно – немного более трудное, менее ясное, и не так легко обнаруживаемое. У вас есть временное дублирование, когда одна и та же работа делается повторно – в то время, когда так не должно быть. Это не проблема в том же понимании, как предыдущие две формы дублирования, так как это не приводит к наличию лишнего кода. Но это может стать проблемой при масштабировании системы, когда повторяющаяся работа начинает отнимать много времени. Для решения этой проблемы могут использоваться различные техники кеширования.
Из трёх вышеназванных типов, текстовое дублирование является самым худшим. Оно загрызёт вас раньше других, когда ваша система будет расти. Оно имеет гадкую особенность быть подобной вирусу: когда ваш код заболел дублированием, он уговаривает вас думать: "О, это не такая уж и проблема, если я просто возьму вот этот кусок кода, положу его копию здесь и немного подгоню его. В конце концов, все вокруг делают это!" Это сильно напоминает Разбитое Окно (Broken Window), о котором говорили Дэйв Томас и Энди Хант (Dave Thomas & Andy Hunt). Если вы не возвыситесь над мелочами, которые появляются так или иначе, всё в конце концов пойдёт коту под хвост.
Итак, весьма вероятно, что какая-то часть вашего кода – отстой.
Что с этим можно сделать? Ну, для начала вам придётся признать факт (и я надеюсь, что эта статья вам помогла в этом) и сознаться в том, что это – проблема.
Затем, у вас есть выбор. Вы можете что-то с этим делать. Вы можете изучить новые способы работать: способы, которые помогут вам писать лучший код. Вот и чудесно. Если хотя бы один программист здесь делает это, я буду счастлив.
Ваш второй вариант – не делать с этим ничего, и продолжать писать код так же, как прежде.
Это ваш выбор. Выбирайте с умом.
Proverbs are used to express universal truths or life lessons in a short and memorable fashion. I find that they are a great way to keep things in perspective, both in life and in work. Because of this, I have assembled 10 programming proverbs that every developer needs in their arsenal.

Relax. It's probably just another fire drill
Poorly designed code tends to manifest itself through some common tell-tale signs. Some examples of these are:
Developers often refer to these as code smells, but personally, I think the term "code smoke" or "code fumes" is more appropriate as it implies a higher sense of urgency. If you don't address the underlying problem it will come back to burn you later on.
( Read more... )</div>
Programmers all have their personal pet peeves. Whether it's scope creep, Hungarian notation, or smelly coworkers, there are certain nuisances that we must put up with in our line of work. The following is a list of the top 10 things that annoy programmers, compiled from the results of my recent question on StackOverflow along with some of my own experiences as a programmer
У всех программистов есть своя любимая мозоль. Растущие требования к проекту, венгерская нотация, дурнопахнущие коллеги – всё это нюансы, с которыми приходится мириться по ходу работы. Следующий список – это топ 10 вещей которые раздражают программистов, собранные из ответов на мой последний вопрос на StackOverflow вместе с несколькими моими случаями из опыта работы программистом:
10. Комментарии, которые объясняют «как», но не «почему»
Вводные курсы для программистов учат студентов комментировать рано и комментировать часто. Идея в том, что лучше иметь слишком много комментариев, чем слишком мало. К сожалению, многие программисты неправильно понимают эту идею как необходимость комментировать каждую строку кода, в результате мы получаем код наподобие этого (из поста Джефа Атвуда про [ссылка]кодирование без комментариев[/ссылка]):
r = n / 2; // r присвоить n деленное на 2
//Повторять пока r-(n/r) больше чем t
while ( abs( r - (n/r) ) > t ) {
r = 0.5 * ( r + (n/r) ); //Присвоить r половину от r + (n/r)
}
У вас есть какие-нибудь идеи, что делает этот код? У меня нет. Проблема в том, что здесь есть комментарии, которые объясняют что делает код, но не объясняют почему. Если бы в программе был баг, и вы споткнулись бы на этом коде, вы не знали бы, с чего начать. Рассмотрим тот же код, только с другим набором комментариев:
// вычисление квадратного корня методом аппроксимации Ньютона-Рафсона
r = n / 2;
while ( abs( r - (n/r) ) > t ) {
r = 0.5 * ( r + (n/r) );
}
Намного лучше. Мы все еще не слишком понимаем, что здесь происходит, но по крайней мере имеем точку отсчета.
Комментарии предполагались для помощи программисту в понимании кода, но не синтаксиса. Обычно справедливо утверждение, что люди, которые читают ваш код, имеют базовое представление о том, как работает цикл, так что нет необходимости добавлять комментарии типа «// итерации по списку пользователей». С чем люди, читающие ваш код, не знакомы, так это с бизнес-логикой и причинами, лежащими за ней.
9. Перерывы в работе
Очень мало программистов способны перейти от нуля к кодированию в один момент. Мы больше похожи на локомотивы чем на феррари; нам необходимо время для того чтобы начать, но потом мы можем проделать впечатляющий объем работы. К сожалению, очень сложно врубится в программирование, когда вас постоянно беспокоят клиенты, менеджеры и собратья программисты.
Нам надо держать в головах слишком много информации во время написания кода, так что у нас нет возможности остановить работу над задачей, заняться чем-то другим, а затем продолжить нашу работу и не потерять что-нибудь. Перерывы в работе останавливают наш локомотив мышления, и ставить его обратно на рельсы – процесс долгий, неприятный, и что хуже всего, чреватый ошибками.
8. Ползучие изменения
Из Википедии:
Ползучие изменения (также называемые базовыми изменениями, ползучими требованиями, опциональными изменениями, и иногда – «синдромом мелких кухонных доработок») в управлении проектами означают неконтролируемые изменения рамок проекта. Этот феномен может случаться когда рамки проекта определены, документированы или контролируются недостаточно точно. В общем это негативные инциденты, которых лучше избегать.
Ползучие изменения превращают относительно простые требования в ужасно сложных и поглощающих время монстров.
Для человека, который пишет требования к проекту, достаточно лишь несколько невинных нажатий на клавиши, чтобы границы проекта расползлись:
Версия 1: Показать карту местности
Версия 2: Показать трехмерную карту местности
Версия 3: Показать трехмерную карту местности и чтобы пользователь мог по ней «летать».
Черт возьми! Это превратило 30-минутную задачку в массивную комплексную систему, которая требует тысячи человеко-часов. Что хуже всего, наибольшее число ползучих изменений случается уже на этапе разработки, и это требует переписывания, рефакторинга, а иногда даже отбрасывания кода, разработанного всего несколько дней назад.
7. Менеджеры, которые не смыслят в программировании.
[Подпись к картинке:] Ок, здесь есть повод взбодриться.
У менеджеров нелегкая работа. Люди непостоянны и переменчивы. Сделать так, чтобы большая группа людей была удовлетворена и связана воедино, это очень сложная задача. Однако менеджеры реально должны иметь базисное понимание того, чем эта группа занимается, особенно в технологичных сферах деятельности. Иначе вы закончите неконтролируемыми изменениями рамок проекта, нереалистичными сроками и чувством разочарования у обеих сторон. Это довольно общая жалоба среди программистов, источник многих неприятностей (и одного забавного <a href=http://www.dilbert.com>комикса</a>)
6. Документирование своих приложений
Существует множество програм генерирующих документацию, но как показал мой личный опыт, они хороши только для создания справочников по API, пригодных для чтения другими программистами. В общем же и целом, если вы работаете над приложением, которым люди активно пользуются каждый день, вам придется писать документацию, которая будет понятна даже самому неискушенному пользователю (например как работает ваше приложение, справочник по возможным ошибкам, и так далее).
Несложно заметить что написание документации – это одна из вещей, которую программисты делают просто ужасно. Просто бегло посмотрите на большинство нынешних open-source проектов. В чем они постоянно просят помощи? Вы угадали. Документация. Я думаю что смогу уверенно сказать за большую часть программистов во всем мире, когда спрошу – «не мог бы кто-нибудь еще сделать это?».
5. Приложения без документации
Я не говорил, что мы не бываем лицемерами. ;-). Программистов постоянно просят использовать сторонние библиотеки в своих проектах. Для этого нам обычно бывает нужна некоторая документация. К сожалению, как было сказано ранее в пункте 6, программисты ненавидят писать документацию. И вот ирония не обошла нас стороной.
Ничто не огорчает более, чем попытка использовать стороннюю библиотеку, когда ты абсолютно не врубаешься как работает и половина функций из API (и нет способа это узнать). Какая разница между НеясноНазваннаяФункция() и НеясноПохожеНазваннаяФункция()? Нужно ли мне проверять на ноль данные до того как обратится к СвойствуХЗ? Думаю это можно узнать только путем проб и ошибок! Черт...
4. Железо
Любой программист, которого просили помочь разобраться со странными падениями сервера баз данных, знает, что проблемы с железом – это жуткая вещь. К сожалению, люди думают, что если мы работаем с компьютерами, то мы знаем как их нужно чинить. Возможно, это и справедливо в отношении некоторых программистов, но большинство из нас этого не знает, или не интересуется тем, что происходит после того, как наш код будет преобразован в машинный язык. Мы просто хотим знать, что он работает и мы можем сконцентрироваться на задачах высокого уровня.
3. Неопределенность
«Вебсайт сломался». «Опция X работает не правильно». Нечётко сформулированные требования давят на мозги. Меня всегда поражает то, как разгневанные пользователи-непрограммисты сообщают о проблемах программисту. «Она сломалась, почини её!» – это не та информация, с которой можно работать.
Программное обеспечение (по большей части) однозначно реагирует на внешние воздействия. Нас это вполне устраивает. Поэтому ублажите нас, описав какой именно шаг процесса не работает вместо того, чтобы просто сказать «почини ее».
2. Другие программисты
Программисты не всегда хорошо ладят с другими программистами. Шокирующая, но правда. Здесь можно было бы легко составить свой топ 10 главных проблем, так что я просто опишу несколько самых распространенных привычек программистов которые надоедают другим программистам и воздержусь от того чтобы впадать в детали в отдельной статье:
Сварливость вплоть до враждебности.
Нежелание понимать, что есть время для дебатов по системной архитектуре и время для реализации.
Неумение общаться эффективно и сбивающая с толку терминология.
Неспособность честно делать свою долю работы.
Равнодушие к основному коду и всему проекту.
И наконец, далеко не последняя по значимости вещь номер 1, раздражающая программистов...
1. Собственный код, 6 месяцев спустя
[Подпись к картинке:] Не дыши, кажется я нашел баг.
Когда-нибудь приходилось смотреть на свой старый код и болезненно морщиться? Как глуп же ты был! Как мог ты, тот кто сейчас знает так много, написать такое? Уничтожить это! Сжечь дотла!
Итак, хорошие новости. Вы не одиноки.
Правда в том, что мир программирования постоянно меняется. То, что сегодня считается лучшим выбором, завтра может выйти из употребления. Мы должны принять то, что никогда не будем знать всего и совершенный код это всего лишь несбыточная мечта. Трудно признавать, что ваша работа, выглядящая столь прекрасно в данный момент, позже станет просто смехотворной. И это удручает, потому что сколько бы мы не делали исследований в области последних и замечательных инструментариев, элементов дизайна, фрэймворков, приемов программирования, наша цель всегда оказывается вне досягаемости. Для меня это самая неприятная вещь в работе программиста; хрупкость того, что мы делаем необходима для дальнейших улучшений, но меня не покидает чувство, что я – один из монахов, рисующих на песке.
Ну что же, вот они. Топ 10 вещей которые достают программистов. Опять же, если вы увидите, что я что-то упустил, дайте мне об этом знать в комментариях!
Оригинал (Английский): Top 10 Things That Annoy Programmers
Перевод: © tigra-alive, tpumapa3m, VlexZ, Андрей Дягель, the_corrector, n-two, kycok, Александр, dmitry, Dim, kuzyakiev, sergakrem.livejournal.com .

The Microsoft Certified Professional Developer: Windows Developer (MCPD: Windows Developer) - эта сертификация подтверждает, что Вы имеете необходимые знания и навыки, которые требуются для построения сложных клиентских приложений на платформе Windows Forms с использованием .NET Framework 2.0.
Кандидаты на статус MCPD: Windows Developer в первую очередь должны выполнить требования для получения сертификации MCTS: .NET Framework 2.0 Windows Applications (два экзамена: 70–536 и 70-526). После этого необходимо сдать еще один обязательный экзамен. В приведенной ниже таблице указаны учебные курсы, необходимые для подготовки к экзаменам на статус MCPD: Windows Developer.
| Тест | Курс |
| 70–536 TS: Microsoft .NET Framework 2.0 - Application Development Foundation | 2956 Developing Applications with the .NET Framework 2.0 Foundation |
| 70-526 TS: Microsoft .NET Framework 2.0 - Windows-Based Client Development | 2546 Core Windows Client Development with Microsoft Visual Studio 2005 и 2547 Advanced Windows Client Development with Microsoft Visual Studio 2005 |
| 70–548 PRO: Designing and Developing Windows Applications by Using the Microsoft .NET Framework | 2631 Optimizing the Software Development Life Cycle with Microsoft Visual Studio Team System |
![]() | You are viewing Log in Create a LiveJournal Account Learn more |