Тест на знання C++

Квітень 28th, 2009

Життя підкинуло цікаву ідею для перевірки практичних навичок C++ програміста. Таке собі тестове завдання.

Нижче наведено клас — зв’язаний список, призначений для зберігання всяких різних об’єктів. Клас поганий, нормальний С++ програміст такого собі дозволяти не повинен. Як ви гадаєте, що саме недобре у цьому класі?

  1. class Linked_Lists
  2. {
  3.     public:
  4.         Linked_Lists();
  5.         ~Linked_Lists();
  6.         bool add(void *data);
  7.         bool remove_head();
  8.         bool first();
  9.         bool last();
  10.         bool next();
  11.         bool prev();
  12.         void* get_data();
  13.         bool is_empty();
  14.         int get_count();
  15.  
  16.     protected:
  17.         struct Node
  18.         {
  19.             void *data;
  20.             Node *prev_node;
  21.             Node *next_node;
  22.         };
  23.         Node *head;
  24.         Node *tail;
  25.         Node *current;
  26.         int count;
  27. };

Слід сказати, тут дещо специфічний дизайн, так уже сталося. Елементи додаються та видаляються зі списку за принципом FIFO. Водночас, доступний вказівник, який можна туди-сюди пересувати по списку, щоб отримати доступ до будь-яких даних. Втім, це не суттєво. Припустимо, так було потрібно для чогось.

Справжній недолік цього класу в іншому. У якості підказки варто глянемо на реалізацію деструктора:

  1. Linked_Lists::~Linked_Lists()
  2. {
  3.     Node *node;
  4.  
  5.     if (head == 0) return;
  6.  
  7.     first();
  8.     do
  9.     {
  10.         node = current;
  11.         next();
  12.         delete node->data;
  13.         delete node;
  14.     } while (current != 0);
  15. }

Що ж саме у ньому не так? (ще…)

Категорії: C/C++ | Теґи:, | Кометарів немає

Чи не переоцінено значення відкритого ПЗ?

Квітень 24th, 2009

У блозі Coding Horror був цікавий пост “Is Open Source Experience Overrated?” переклад якого я і пропоную вашій увазі.

===============================================================

На мою думку, що програмуванню слід навчатися на полі бою. А найбільше, наймасштабніше поле битви — це область програмного забезпечення з відкритим вихідним кодом.

Зробіть вклад у якийсь відкритий проект. Їх тисячі, тож можна буде вибрати, який вам більше до вподоби. Але виберіть лише один, і глибоко вивчіть його, станьне активним розробником. Нема нічого більш практичного, більш реального, ніж сумісна робота з багатьма програмістами різних рівнів досвіду з усіх куточків земної кулі.

Якщо вам хочеться покращити свої навички програмування, що може бути краще, ніж робота у справжньому проекті з відкритим кодом? Їх тисячі, а можливо, і сотні тисяч. І деякі навіть змогли значно змінити світ.

На жаль, це не допомогло одному звичайному розробнику, анонімний лист якого я нещодавно отримав. От що він пише:

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

У одній компанії мною зацікавились. У них була політика: пропонувати кожному кандидату виконати пробне завдання. Я виконав це завдання, застосувавши перше ж рішення, яке спало мені на думку. Згодом під час телефонної розмови, їх хлопець витратив п’ять хвилин свого часу, розказавши, наскільки неефективним був мій розв’язок. Моя робота справила не дуже гарне враження. Тоді я запитав, чи дивився він на ті проекти, які я згадував. Він сказав, що не дивився. Схоже, негативне враження щодо мене вже сформувалося після проваленого тесту. Важко сказати, які критерії використовувались для оцінки результатів тесту, але, схоже, результат завалив усе інтерв’ю.

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

Ще одному рекрутеру я сказав, що якийсь час працював у сфері комерційного ПЗ, поки знову не повернувся до школи. Пропрієтарний характер розробки не дозволяє мені багато про неї розказувати. Але факт, що робота була комерційною, аж ніяк не впливає на рівень моїх знань чи на мій вклад у створений проект. Чому я навчився у ті часи, так це заповнювати плани та оцінювати тривалість роботи. Втім, тепер ці навички знаються рекрутерам застарілими.

Жахливе протиріччя з усіма ідеями щодо відкритого ПЗ, які я так захищав. Він продовжує:

Я спробував зрозуміти хід їхніх думок. Сила-силенна проектів з відкритим кодом написані дуже погано. Їх створювали, щоб реалізувати якусь ідею, а не для того, щоб задовольнити потреби користувачів. У академічному середовищі опублікування роботи є важливішим, ніж збільшення кількості користувачів. У людей, що займаються комерційною розробкою, складається враження (інколи вірне, а інколи ні), що розробники відкритого академічного ПЗ не володіють певними практичними навичками. Я не кажу, що мій відкритий код найкращий, але він працює, він добре документований, і доступний для аналілу. Одна з причин, чому я багато часу витратив на роботу у вільних проектах — бажання зробити пошук роботи легшим. Я думав, великі зразки публічно доступного робочого коду скажуть роботодавцям більше про мене, ніж результати одного нещасного тесту чи рядок у резюме “проведено років”. Тепер я знаю більше про всю шумиху навколо відкритого коду. Я багато чув, багато робив, багато чого опробував на собі. Час від часу слід повертатися до реальності і задавати питання — а чи не переоцінено значення відкритого коду?

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

З іншого боку, вибір проекту має таке ж велике значення, як і власне програмування. Скільки існує проектів, що дарма витрачають зусилля, вирішуючи нікому не потрібні проблеми, або завдання, наскільки вузькоспеціалізовані, що ніхто, крім авторів, у них не розбирається? Як комерційна програма не може існувати без клієнтів, так і проект з відкритим кодом не можна уявити без певної критичної маси користувачів. Пам’ятайте, не достатньо просто випустити програму. Відкрили ви свій код чи ні, якщо ви пишете програми, які навряд чи хтось буде використовувати, якщо вам не вдалося зацікавити роботою у проекті ще хоча б кількох програмістів –

Тоді, що ви в біса робите?

Категорії: програмування | Теґи:, , , | Коментарів: 1

Ui : дрібниці

Квітень 22nd, 2009

Зліва — приклад правильного інтерфейсу, справа — інтерфейс, у проектуванні якого було допущено помилку:


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

Ще один приклад цієї ж самої помилки:

За замовчуванням варто було б пропонувати годинну сесію (менше двигунець форуму не дозволяє), натомість вони пропонують логін назавжди.

З іншого боку, що мені не подобається у проектуванні графічних інтерфейсів — так це те, що кожне рішення можна виправдати. Наприклад, можна сказати, що ресурс work.com.ua орієнтується на людей, які не мають великого досвіду роботи з комп’ютером. Таким людям легше заходити на сайт без паролю, тому інтерфейс і пропонує цей варіант за помовчанням. А ukr.net — це веб-інтерфейс, призначений скоріше для гіків (бо «звичайні люди», як правило, використовують програми-клієнти типу Outlook). Гіки більш схильні не довіряти свої дані браузеру, тому для них опцію впізнавання краще відключати. Непогана така теорія, розбиває її лише факт, що http://job.ukr.net/ теж має невідзначений чекбокс «Запам’ятати», хоча з work.com.ua вони ділять одну й ту саму аудиторію.

Категорії: програмування | Теґи:, , | Коментарів: 2s

Blobby Valley

Квітень 17th, 2009

Про що ж ще писати у п’ятницю перед довгими вихідними, як не про ігри? Але це — не просто гра, це легендарна гра, впізнавана з першого погляду:

І, як виявилось, ця гра доступна всіх можливих платформах, в тому числі й на Linux. Качати на http://sourceforge.net/projects/blobby

Поки що у проекту статус Alpha, але програма цілком стабільна. І на Windows, і на Linux без проблем вдалося зіграти з компом пару партій.

Порівняно з канонічною версією, у проекті з’явилося кілька нових фіч. Наприклад, можливість зберігати запис гри. Крім того, можна писати свої скрипти (на lua) для управління гравцем. А потім, при бажанні — влаштовувати чемпіонати, чий штучний інтелект виграє більше матчів;)

Категорії: linux, Посилання на цікаве | Теґи:, , , | Кометарів немає

iColud — операційна система у хмарах

Квітень 11th, 2009

Днями компанія Xcerion AG оголосила про створення чогось надзвичайного: операційної системи, яка повністю базується в інтернеті. Не так, як раніше, коли брали якийсь linux-дистрибутив і набивали туди програм для роботи з онлайн-сервісами. Ні, тепер все чесно, система дійсно живе десь на сервері і завантажується у браузері.

Реєстрація безкоштовна, тож я швиденько побіг на http://icloud.com, щоб на власні очі побачити, що воно таке. Результат — багато картинок. (ще…)

Категорії: Життя | Теґи:, | Коментарів: 1