Data Science fwdays сonference — few-shot learning, snorkel, black box and more! Kyiv, Sep 7

Пожалуйста, покритикуйте проект

Привет, DOU.

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

Идея для проекта у меня появилась пару месяцев назад, когда любимая программа-словарь TranslateIt перестала открываться, и во время запуска генерировала бесконечные MessageBox’ы с текстом «Unknown error». Переустановка не помогла, а других подобных (и настолько же удобных) приложений я не видела.

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

Приложение позволяет перевести выделенный (в любом другом приложении) текст и, пока нажат левый Alt, показать перевод, сделанный тремя онлайн-переводчиками: Google, Bing и Yandex (то есть выделяете текст, зажимаете Left Alt, и как только один из переводчиков вернет результат, появится окошко с переводом выделенного текста). Первый вызов окошка может потребовать удерживать клавишу секунд 5-7, в дальнейшем оно появляется почти сразу.
Активные переводчики и языки перевода (по умолчанию — eng-ukr) можно менять в опциях (опции и выход из программы доступны через иконку S&T в трее).
Работоспособность проверялась на Windows 7×64 и Windows 8.1×86.

Код здесь: github.com/...uxintN/SelectAndTranslate

Отдельная благодарность Александру Агаханову, который внес несколько небольших улучшений в код (в частности, показал, как лучше работать с WPF-ресурсами) и сообщил мне о некорректной работе программы на Windows 8 (проблема уже устранена).

Вопрос к сообществу: можно ли использовать такой проект при поиске работы .NET джуна/трейни?
Просто насколько я знаю, в Украине .NET движется в сторону web-разработки, и я сама сейчас в основном учу ASP.NET MVC & JavaScript. А проект (WPF/WinForms/WinAPI) создавался больше исходя из практической полезности.

И, разумеется, буду очень признательна за критику и советы по коду :)

LinkedIn
Допустимые теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter
Допустимые теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter

я чета туплю, как поставить эту бадягу ? это плагин для хрома или апликуха для айпада ? как все это заставить работать ?

Скомпилировать в Visual Studio. Ну или скачать уже откомпилированные бинарники отсюда www.ex.ua/171950507117


this.Dispatcher.Invoke(() =>
{
var boldResult = new Bold(new Run(text));
textBlock.Inlines.Add(boldResult);
});

Для переброски делегата в UI поток лучше использовать Dispatcher.BeginInvoke(...), оно поставит делегат в очередь и сразу же продолжит работу, а Invoke блокируется до выполнения делегата.

Dispatcher.Invoke, вроде, не бросает каких-либо исключений которые стоит отлавливать, в т.ч. и TaskCanceledException.

Dispatcher.Invoke, вроде, не бросает каких-либо исключений которые стоит отлавливать, в т.ч. и TaskCanceledException.
По идее, он будет пробрасывать все исключения, которые бросил метод, который был вызван.
TranslationWindow.xaml.cs
---- public async void RunTranslationAsync()

await Task.WhenAny(translationTasks);

private void runTranslationTasks(string clipboard)
{
translationTasks.Clear();
foreach (var translator in Translators)
{
translationTasks.Add(Task.Run(() =>
{
string result = translator.Translate(clipboard);
AppendResultText(translator + “:\n”);
AppendBoldResultText(result);
AppendResultText("\n\n");
}));
}
}

facepalm
Ой мама Какой ужос! Мачасть.... учите мачасть. Почитайте Рихтера

Рихтер большой :) Уважаемый аноним, может упростите мне и без того нелегкую жизнь программиста-новичка и проявите чуть больше конкретики?)

Да уж помощнички, давайте аргументировать перед тем как фейспамить. Лично я ничего не вижу такого, что заслуживает реакции типа «Ой мама Какой ужос!».

Анон, дай линк на свой гитхаб, мы заценим...

Думаю стоит сделать более интересный проэкт

Сделайте тридэ экшон, суть такова...

Я думаю якщо із власною фантазією — туго, то краще поліпшити вже існуючі програми і додатки, спробувати підвищити їх ефективність, навіть якщо банальної програми — це буде непогано.

Вы предложили сделать более интересный проект, следовательно, этот для вас недостаточно интересен. Чем Вы руководствовались, определяя неинтересность моего?
Должно же быть какое-то приложение, которое Вы считаете интересным. Поэтому я попросила привести пример.

Ви захотіли критики — я відгукнувся, Ваш проект — скучний, тим більше, я впевнений, що якщо 5-10 хв поритись в інтернеті — знайдеш десятки аналогів, із будь-яким інтерфейсом і т.д., нічого більшого ніж порада спрямувати свою енергію і зусилля у розвиток вже існуючого софта, або додаткові фічі

Уверяю, я рылась в инете куда дольше 10 минут. Переводчиков действительно много, на любой вкус, но мне нужны были две фичи:
1) так полюбившееся в TranslateIt отображание окна с переводом через удержание клавиши (не нажатие, хотя его реализовать намного проще)
2) вывод в одном окне результатов перевода сразу нескольких переводчиков (чтобы сразу же можно было сравнивать их точность)
Не удалось найти аналог даже по (1) пункту. Поэтому написала свой.

А интересность — это весьма субъективное понятие. Я писала проект в первую очередь для себя, мне он был и интересен, и полезен (как в использовании, так и потому, что в процессе написания я узнала много нового, немного разобралась с тем, как в Windows устроены элементы интерфейса на низком уровне и как работать с unmanaged кодом).
И как уже заметили — в качестве демо-проекта важна в первую очередь даже не идея, а умение правильно использовать технологии, писать чистый и понятный код.

Сейчас я провожу работу над ошибками, и если Вам есть, что сказать по этому поводу — буду рада услышать конструктивную критику.

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

он вообще не программер
тим більше з його такими фразами...
Взагалі ШАГ — добрий навчальний заклад

хе — хе, а те, що у 100% державних навчальних закладах ти закінчуєш заклад завдячуючи грошам, а іноді закінчуєш ТІЛЬКИ завдячуючи грошам? Ахаха правда? ;) Ви дійсно вважаєте, що державний заклад може дати кращу комп. освіту ніж спеціалізована академія? діло ваше конех., але моя думка — якщо сам зацікавлений в освіті — то вивчишся будь-де.

Ви дійсно вважаєте, що державний заклад може дати кращу комп. освіту ніж спеціалізована академія?
ніж ЦЯ академія — однозначно так :)
крім того це дуууже дієвий фільтр проф придатності, який ви або не змогли, або не захотіли пройти.
державна освіта не дає гарантії придатності, але якщо ви мали здібності і натхнення — ви матимете купу знань потрібних в роботі, про які вам так радісно обсирались в шазі що «там би вас нагружали от тим ... а в нас нема, в нас краще!!»
пс, хочете знати враження про шаг працедавців? гугліть, якщо навчились ;)

А тепер про Вас — вивалили бабки за навчання або ваш знайомий-початківець-енікейщик вивалив бабки і не «стягнув» не те, що завершити — а пройти перших 2-3 екзамени (викладачі взяток не беруть) ? Я просто не можу зрозуміти звідки така відраза?)
Диплом — вже давно не вирішальний фактор прийому на роботу, а тим більше оцінювання знань... виключення є конех — MIT і схожі, ой, MIT — також спеціалізований навчальний заклад, інший рівень, але...бачите зв’язок?

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

Мой ВУЗ особого IT-образования не дает. Направление — компьютерные науки, а судя по половине предметов, вся суть которых сводится к «наклацайте в экселе 100500 способов решить линейное уравнение и сделайте красивый цветной отчетик» — нас учат на продвинутых секретарш. Но при этом с радостью платят нам стипуху, абы мы только учили хоть что-то (а вылететь почти нереально, и даже чтобы слететь со стипухи нужно сильно постараться).
В таких условиях вполне можно игнорить эту «учебу» и сосредоточиться на действительно серьезных вещах. Да и попадаются иногда преподаватели, которые действительно знают свой предмет и имеют реальный опыт работы. Сейчас только один такой человек на всей нашей IT-кафедре, но и то радует:)

А тепер про Вас
ок
вивалили бабки за навчання
ні
або ваш знайомий-початківець-енікейщик вивалив бабки і не «стягнув» не те, що завершити — а пройти перших 2-3 екзамени
ні
(викладачі взяток не беруть)
ні ( :( )
от бачите, навіть гадати вас в шагу не навчили...
Я просто не можу зрозуміти звідки така відраза?)
відгуки про колишніх студентів «ітшників» звідти, відгуки про просто студентів звідти, відгуки про викладачів звідти, відгуки про систему навчання і викладання, відгуки про керівництво і бухгалтерію, та в принципі про все що з тою добре відомою шаражкою звязане :)))
Диплом — вже давно не вирішальний фактор прийому на роботу,
а я і не кажу що з дипломом КПІ чи львівським універом франка вас зразу візьмуть на роботу... ваше резюме просто перестануть одразу викидати рекрутери — різниця є, не спорю, але заради того одного вже вартує :)))
MIT — також спеціалізований навчальний заклад, інший рівень, але...бачите зв’язок?
бачу :)))
ви порівнюєте один з 5ки найкращих в _світі_ технічних вузів, який в рекламі непотребує так щоб взагалі, отримує тонни аплікантів і фільтрує їх як самому захочеться...
з добре відомою в україні шаражкою, основний підхід якої — доїти лохів, що туда припруться ? :)))
не, звичайно, там є рідкі «викладачі», що хз як викладають, але пішли туди одночасно працюючи в нормальній індустрії, і хочуть опеньків дотягнути хоча б до рівня джуна, але вони одночасно і рідкість, і мають аж один предмет, і часто не мають ні скілів ні здібностей щоб реалізувати свою благородну мету...

ви взагалі вкурсі що ваші «пред’яви» неочем, особливо після того як ви заговорили про «відгуки», і взагалі ви звичайно знаєте що існує не одна філія? Я думаю це не співрозмірно із ситуаціями коли я зустрічаюсь з друзями і вони мені розважливо розказують що без бабла ніодин предмет не іде, і можна піти ще ближче — сестра також, а ви судите мене за вуз, якщо я випустився із шагу то мені не можна виразити думку? а ті люди, які підтримують корупцію — вони норм конех, да, «це ж не корупція, це для спільного блага, для мого диплому»...
А проф-придатність доказується атестатом, або вступними екзаменами — це тільки в нас зно — замітьте, через цю ж корупцію, мол в школах може бути корупція гоу зно «замутим», а по проходженню цього ж зно ти поступаєш в корупційний вищий навчальний, це хіба не маразм?
І по суті відповідайте ане «ой я чув, читав...»


і взагалі ви звичайно знаєте що існує не одна філія?
про шаг довелось чути позитивний відгук і здивування АЖ один раз. коли чуваки з харкова(?) на майкросовтівському кубку наваяли руку для читання брайля вголос (чи щось таке)
що без бабла ніодин предмет не іде
от це і відгук про їх проф придатність :)))
в мене за 5 років навчання на викладачів пішло менше 100 грн, і то лише за економіку і фізру, і нічого..
а ті люди, які підтримують корупцію
а хто їх підтримує? :)))
якщо я випустився із шагу то мені не можна виразити думку?
можна, якщо вона доречна, адекватна, і розумна, якщо неаргументоване обсирання — це мінус вам же і вашому шагу :))
А проф-придатність доказується атестатом, або вступними екзаменами
емммм... погугліть визначення... ваш атестат на прийомі на роботу взагалі нікому не потрібний...
мол в школах може бути корупція гоу зно «замутим», а по проходженню цього ж зно ти поступаєш в корупційний вищий навчальний, це хіба не маразм?
поділіться травою, а?
І по суті відповідайте ане «ой я чув, читав...»
коли інформація іде з перших рук, і від людей які заслужили довіру — вона побільше важить ніж крики в неті «ні, він крутий, я ж там вчився!!»

неаргументоване обсирання? Вищий клас... це ваша суб’єктивна думка, а «висери» йдуть виключно, і умовно з ваших уст! Не приємно спілкуватись з такими людьми, які зациклені на своїх поглядах і переконаннях, для вас в апріорі немає обгрунтованих висказувань (якщо це виходить за межі тих же переконань), про адекватність взагалі мови немає, а тепер про вашу гру в «цитати» — цитуйте всю фразу, ане те, що вам завгодно, а ще, не завадило би відповідати на питання, а не «відмахуватись смішками», давайте зійдемось на тому, що ваш мозок дуже...вузькопрофільний і плоский, такий же плоский як netBT — ліс доменів не построїш але присвоїти логічні імена в локалці — на ура... ; )

неаргументоване обсирання?
приклади:
Ваш проект — скучний
що у 100% державних навчальних закладах ти закінчуєш заклад завдячуючи грошам, а іноді закінчуєш ТІЛЬКИ завдячуючи грошам
вони мені розважливо розказують що без бабла ніодин предмет не іде,
мол в школах може бути корупція гоу зно «замутим»
хе — хе, а те, що у 100% державних навчальних закладах ти закінчуєш заклад завдячуючи грошам, а іноді закінчуєш ТІЛЬКИ завдячуючи грошам?
Це не так.
Ви дійсно вважаєте, що державний заклад може дати кращу комп. освіту ніж спеціалізована академія?
Так, 100%. Я і досі вдячний КПІ за базу CS, і в роботі ця база дууже не зайва.
Ваш проект — скучний
Субъективно. Для начинающего программиста главное — чтобы ему этот проект был интересен, и чтобы можно было скилы прокачать, с чем данный проект вполне справляется (как написали ниже, тут и WPF, и Multithreading, и P/Invoke, и Web...).

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

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

скука ужасная, шо описание, шо способ установки
ви код відкривали?

да шото пытался — отступы ровные, комментов нет, придраться не к чему. тема называется «покритикуйте проект» а не код.

проект — тестовий, мета — технічна цікавість і оцінка технічної грамотності автора, а не стартаперське «куплять/не куплять»...

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

покажите пример, возможно проблема надуманна

Ну вот хотя бы, самое начало книги, которую я уже прочитала (на что ушло почти 2 месяца, тогда как обычно примерно такую же по объему успеваю примерно за неделю). Тут в основном сложность именно в словах.

Everyone turned and stared; at Kero, and at the boy about to lose the towering platter of bread. The racket of pots and voices stopped, and Kerowyn’s voice rang out in the silence like a trumpet call, but no one answered this call to arms. They all seemed confused or frozen with indecision. The scullion staggered two more steps forward; the edible sculpture, two clumsy, obese bread-deer (a stag and a reclining doe), began sliding from the oversized serving dish he was attempting to carry alone.

Нет, не надумана. Нету такой штуки — «нормальное владение английским».
И да, вот так словарный запас и пополняется.

Текст выше у меня проблем не вызывает, но одно слово пришлось глянуть.
В самописной (лет 10 назад) поделке аналогичного назначения, только с локальным словарём.

Так что программа не бесполезная. И не только как тестовый проект.

Нормальный проект. Там вообще суть не очень важна, там нужно показать умение писать и осваивать новые технологии, а для этого важны манёвры, архетиктура, ясность и чистота кода. Настя доработает, и будет хороший демо проект по WPF, P/Invoke, Multithreading.

Анастасия, а можете подробнее о переводчиках? Если я не ошибаюсь, то и Google и Yandex API платные. Или это не так? Я интересуюсь потому что в своем pet-проекте тоже хочу использовать переводчик.

Яндекс бесплатный, а вот с Гуглом — пришлось парсить страничку.

Не знаю, может пригодится. Я нашел бесплатный переводчик, который предоставляет API glosbe.com/a-api. Там же и примеры.

github.com/...aster/WinAPI/Clipboard.cs

Чем вообще не устроил стандартный System.Windows.Clipboard?

OpenClipboard(IntPtr.Zero);
IntPtr dataHandle = GetClipboardData(CF_UNICODETEXT);
clipboard = Marshal.PtrToStringUni(dataHandle);
CloseClipboard(IntPtr.Zero);

Если используете Win32API, используйте его правильно. Например, нужно проверять что возвращают функции, потому что они возвращают коды ошибок, которые нужно корректно обрабатывать.

catch (Exception e)
{
    System.Windows.MessageBox.Show(e.Message);
}
return clipboard;

Очень плохая обработка ошибок.

github.com/...er/WinAPI/KeyboardHook.cs

  • Нужно переработать API, чтоб пользователю класса не нужно было знать как устроен API хуков на низком уровне.
  • Что будет если я несколько раз подряд вызову SetHook?
  • В hookCallbackProc нужно делать вызов CallNextHookEx в finally блоке, так как обработчик хуков может бросить исключение.
  • github.com/...nslators/WebTranslator.cs

  • Неудачный выбор базового класса. Могут быть ведь переводчики, не работающие на основе Web. Следует иметь базовый класс Translator.
  • Учитывая API, Translator должен быть stateless, тогда зачем там protected string Text;?
  • public void SetLanguages(Languages langFrom, Languages langTo) Если после создания экземпляра разрешаем менять языки, то почему не сделать 2 read-write свойства?
  • public string GetEncodedText(string text) Почему эта функция являются частью API и почему она вообще в этом классе?
  • protected abstract Uri BuildRequestURI() - В чем потребность выносить эту функцию в базовый класс? Что если у меня нужные данные будут отправляться в POST body, а не в URL?
  • github.com/...slators/BingTranslator.cs

  • 1. using (Stream stream = getResponse().GetResponseStream()) - HttpWebResponse реализует IDisposable, а вы теряете ссылку на него и не вызываете Dispose
  • 2. Плохая обработка ошибок тут
  • catch (WebException e)
    {
    	translation = e.Message;
    }
    

    github.com/...ators/GoogleTranslator.cs

  • return (new WebClient()).DownloadString(BuildRequestURI()); WebClient реализует IDisposable, но Dispose не вызывается
  • Если делаете плохую обработку ошибок, то делайте ее хотя бы consistently bad
  • catch (Exception e)
    {      
        Debug.WriteLine("---Ex:" + e.Message);
        return "EXEPTION";
    }
    

    github.com/...ators/YandexTranslator.cs

  • 1. string key = «.......»; — а почему в Bing модуле ключ не вынесли к константу?
  • Пофиксить порядок параметров в конструкторах
  •         public YandexTranslator(Languages languageFrom, Languages languageTo)
                : base(languageFrom, languageTo) { }
            
            public YandexTranslator(string key, Languages languageFrom, Languages languageTo)
                : base(languageFrom, languageTo) { SetKey(key); }
    

    В обоих случаях languageFRom и languageTo должны идти первыми
  • Попробуйте просто XmlDocument.Load(url) вместо этого:
  •             string y = downloadResult();
                byte[] bytes = Encoding.Default.GetBytes(y);
                translation = Encoding.UTF8.GetString(bytes);
                xmlDocumet.LoadXml(translation);
    

    github.com/...TranslationWindow.xaml.cs
  • Решить проблему с дубликацией кода в AppendResultText/AppendBoldResultText
  • catch (COMException) { throw; } - От кого вы ожидаете получить COMException?
  • Очень грязно и сильно напутано в RunTranslationAsync и runTranslationTasks, там просто надо все взять и переписать
  • Круто. Буду дорабатывать, спасибо.
    Но я с трудом представляю, как улучшить

    Очень грязно и сильно напутано в RunTranslationAsync и runTranslationTasks, там просто надо все взять и переписать
     И так уже старалась упростить, как могла.
    Буду благодарна за более подробный ответ по этому поводу.
    И так уже старалась упростить, как могла.
    Буду благодарна за более подробный ответ по этому поводу.
    Сори, нет времени глубоко вникать в логику того что происходит... Для начала просто избавиться от состояния и передавать его через методы.

    Сделать Extension метод для Translator который будет возвращать Task

            public static Task<string> TranslateAsync(this WebTranslator translator, string text)
            {
                return Task.Run(() => translator.Translate(text));
            }
    

    потом как-то так

            public async void RunTranslationAsync()
            {
                if (!Clipboard.ContainsText())
                {
                    return;
                }
    
                string clipboardText = WinAPI.Clipboard.GetClipboardText();
                
                lblSource.Content = clipboardText;
                lblSource.ToolTip = clipboardText;
                textBlock.Text = "";
    
                var translationTasks = StartAllTranslators(clipboardText);
                await Task.WhenAny(translationTasks);
                this.Show();
    
                await Task.WhenAll(translationTasks);
            }
    
            private Task[] StartAllTranslators(string text)
            {
                List<Task> translationTasks = new List<Task>();
                
                foreach (var translator in Translators)
                {
                    translationTasks.Add(RunTranslatorAsync(translator, text));
                }
    
                return translationTasks.ToArray();
            }
    
            private async Task RunTranslatorAsync(WebTranslator translator, string text) {
                var translatedText = await translator.TranslateAsync(text);
                AppendResult(translator.ToString(), translatedText);
            }
    
            private void AppendResult(string translatorName, string text)
            {
                var translatorElement = new Run(translatorName);
                var textElement = new Bold(new Run(text));
    
                textBlock.Inlines.Add(translatorElement);
                textBlock.Inlines.Add(textElement);
            }
    

    Во внешнем коде нужно убедиться, что RunTranslationAsync вызывается только один раз.
    Еще стоит передавать внутрь Cancellation token, чтоб можно было отменить процес перевода.

    Огромное спасибо, буду разбираться :)

    А насчет

    Чем вообще не устроил стандартный System.Windows.Clipboard?
    — как раз он и выдавал иногда COMException. В случае с WinAPI-реализацией такого не было, но я все же хотела сразу увидеть при дебаге, если это произойдет.

    Здесь пишут:


    The other very important thing to know is that any one of these clipboard calls can fail without warning. The MSDN documentation does not state this, but they can all throw exceptions of type COMException. The most common one that I’ve seen has the error “CLIPBRD_E_CANT_OPEN” which means that the application was unable to open the clipboard. This is generally because another application currently has the clipboard open. The sad thing about this is that generally the best thing to do is to just try again in a moment, because it will probably work.

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

    Если так, то я не заметила, чтобы игнорирование этого исключения вызывало какие-то проблемы. И вот эта часть как-то напрягает:

    generally the best thing to do is to just try again in a moment, because it will probably work.

    Вы не заметили проблемы, потому что все ошибки тихо проглатываете.

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

    Если бы я сейчас искал Junior .Net — разработчика, я Вас безусловно бы взял. Целеустремленность, интерес к работе и умение самостоятельно идти к цели, -т.е. то, что или есть — или нет и не будет — гораздо важнее, чем конкретные знания и умения, которые дело наживное, а значит — будут со временем и у Вас.
    Удачи! И главное — верьте в себя!

    Спасибо за теплые слова :)

    Комментарии стоило бы унифицировать по стилю и содержанию. В частности, вот такой комментарий не добавляет ясности:

    // Window location
    #region Window location

    В идеале комментарии должны позволять автоматически сформировать документацию по проекту.

    Я старалась в первую очередь давать такие названия методам и переменным, чтобы в комментариях не было необходимости. Поэтому наличие комментариев — только в особых случаях, когда требуются дополнительные замечания.
    Хотя с продублированными названиями регионов — это уже просто для того, чтобы визуально проще было их разграничить.

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

    Сейчас у вас небольшое приложение с достаточно прямолинейной логикой. Чем больше проект и чем больше людей над ним работают, тем важней доступность кода для чтения.

    Спасибо, интересный вариант. Хотя немного стрёмно просить разбираться во всех тонкостях моей архитектуры человека, день работы которого стоит как моя универская стипендия :)

    все совсем наоборот

    именно таких и стоит просить

    человека, день работы которого стоит как моя универская стипендия :)
    з поправкою на курс це 800 баксів, джуніор з роком-півтора досвіду — він вам багато не допоможе, хіба впізнає деякі свої помилки у вашому коді, за які йому вже розказували...
    а сінйори 800 грн наберуть за 2-3 годинки, і їм не важко зайві 30 хв приділити вам — якщо захочеться, та й про якусь компенсацію того часу не питатимуть

    я б сделал:
    — вьюшки положить в отдельную папку (опрятность+)
    — добавить настройки для сохранения выбранных направлений для использования после перезапуска (фичи+)
    — локализация приложения (с динамическим изменением перевода при смене языка интерфейса)

    Можно попробовать еще дополнительно заюзать какой-нить фреймворк для WPF + перейти на использование паттерна MVVM.
    Фреймворк — например Caliburn.Micro
    MVVM — MVVM Light (не совместим с CM)

    >>simulateCtrlC
    имхо, коммент лучше выше писать, а не справа. Дело в том, что часто рабочее пространство не равно диагонали 24 дюймового монітора, и текст либо под скроллер прячется, либо wrap включается.

    >> googleIsChosen, bingIsChosen, yandexIsChosen;
    Хотите больше хардкора?
    Сделайте переводчики динамически подгружаемыми или пусть они будут в сборке, но их использование — без выделения каждого переводчика в отдельные переменные.

    т.е. что бы добавление нового переводчика SuperTranslator5000 заключалось в реализации класса, который будет отправлять на сервер запрос и выдавать результат. А не перелопачивания нескольких вьюх для вставки нового.

    Да, мне уже говорили о MVVM и ущербность code-behind подхода, но я сомневалась — вдруг это будет расценено, как стрельба из пушки по воробьям. Фактически, приложение крошечное, для добавления нового переводчика нужно добавить класс + внести изменения в файлы окна опций. Но раз уже два девелопера упомянули об этом — это не может быть совпадением. Буду копать в эту сторону, спасибо.

    MVVM и ущербность code-behind подхода, но я сомневалась — вдруг это будет расценено, как стрельба из пушки по воробьям
     Не будет. Если я правильно понял, то вы хотите использовать этот проект, как пример своих работ. Чем более качественно он будет сделан, тем лучше.
    Если даже и будут люди, которые посчитают MVVM оверхедом, то, поверьте, джуну нечему будет научиться в конторе пишушей код по-принципу «пыщ-пыщ и в продакшн».

    И добавьте тесты...

    Сделаю code-review только после свидания ;)

    Благодарю, но давайте все же не превращать технический топик в очередную ветку «Где вы ищите девушек» :)

    По поводу удобного переводчика — quest-app.appspot.com

    Прикольно, но теперь уже немного поздно.

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

    По коду ничего не скажу — .NET не знаю, но посоветую купить Lingvo. Это лучше онлайн-переводчиков, так как даёт все возможные толкования слова/словосочетания + примеры.

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

    «I don’t give a flying fuck» не переводит ни один онлайн-переводчик из перечисленных. В то время как в Lingvo можно найти перевод «give a flying fuck». Хотя для этого и некоторых других выражений лучше urban dictionary.

    Добавьте в корень проекта README с описанием и скриншотами программы.

    Ок, чуть позже сделаю.

    Касательно WPF или MVC я бы не заморачивался. На собеседовании главным будет как ты пишешь, а не что. Я в свое время переходил с WPF в веб практически без опыта в MVC.
    Как вариант, для GitHub-портфолио еще можно попробовать задания с прошлых UAWebChallenge.
    Так держать!

    Мне и самой интересно, как я пишу. Отчасти для того топик и создавался :)
    Если говорить о рефакторинге, то да — я читала «Рефакторинг. Улучшение существующего кода» Мартина Фаулера. Я старалась в своем коде избегать копи-паста, давать полям и методам понятные имена, которые соответствуют их назначению, не делать методы сликом большими и запутанными... Вопрос в том, насколько у меня получилось. Поэтому нужен кто-то, кто знает, как надо.

    Подписаться на комментарии