Требуется программист

Автор Тема: Требуется программист  (Прочитано 11788 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Александр Пекшев aka ModisАвтор темы

  • ADN Club
  • *****
  • Сообщений: 1658
  • Карма: 366
  • Отец modplus.org
    • ModPlus
Требуется программист
« : 10-04-2014, 10:18:47 »
Одна фирма в Москве (достаточно знаменитая) заказала мне в свое время разработку приложения для автокада. Естественно все официально, естественно за деньги :)
Приложение разработал. Можно сказать 80% готово. Теперь требуется толковый программист для продолжения работы. Причина проста - я уже давно не работаю в этой сфере, не работаю с автокадом, да и некогда мне этим заниматься.
Приложение написано на .Net с использованием WinForms. Сборки для автокадов 2007-2014 + самодельный установщик. Краткое описание: приложение служит для вставки в чертеж стандартных решений из "базы данных". База данных представляет собой папку с кучей подпапок. В каждом каталоге есть файлы чертежей, скрины (если нужно) и xml-файл с описанием и настройкой.
Кстати - решение вот этой http://adn-cis.org/forum/index.php?topic=649.0 проблемы связано с этим приложением
Название фирмы не называю, т.к. они сами просили. Исходники также будут переданы через них - коммерческие права и все такое :)
Естественно я все расскажу, все покажу, отвечу на вопросы

Оффлайн Дима_

  • ADN Club
  • ****
  • Сообщений: 473
  • Карма: 66
Re: Требуется программист
« Ответ #1 : 10-04-2014, 10:38:19 »
Можно сказать 80% готово. Теперь требуется толковый программист для продолжения работы. . Причина проста - я уже давно не работаю в этой сфере...
Я не смог подобрать слов выражающие мое этношение к такой постановке вопроса.
п.с. простите за оффтоп.

Оффлайн Андрей Бушман

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
Re: Требуется программист
« Ответ #2 : 10-04-2014, 10:40:17 »
Приложение разработал. Можно сказать 80% готово. Теперь требуется толковый программист для продолжения работы. Причина проста - я уже давно не работаю в этой сфере, не работаю с автокадом, да и некогда мне этим заниматься.
Во первых, данная ветка форума предназначена не для поиска работы - такие гранаты лучше бросать на dwg.ru - там весьма высока вероятность того, что с низкого старта, на перебой, рванутся даже "за бесплатно".

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

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

P.S. То, что я высказал - относится к любой подобной ситуации.
« Последнее редактирование: 10-04-2014, 10:52:45 от Андрей Бушман »

Оффлайн Александр Пекшев aka ModisАвтор темы

  • ADN Club
  • *****
  • Сообщений: 1658
  • Карма: 366
  • Отец modplus.org
    • ModPlus
Re: Требуется программист
« Ответ #3 : 10-04-2014, 11:15:09 »
Цитировать
Во вторых - поиском должны заниматься работодатели, ибо "подхвативший знамя" с вероятностью 99% окажется в заднице, раз уж его ищет тот, кто собирается "сделать ноги", а не сам заказчик. То, что поиском занимается тот, кто сделал "80% готово" (потом окажется, что и не 80 вовсе..) очень похоже на ситуацию, когда проект находится в глубокой заднице и нужен кто-то, на кого это нужно повесить, а самому слиться (во всяком случае лично у меня именно такое ощущение и возникает).
Я не собираюсь "делать ноги". Я объяснил - я более не работаю в этой сфере. Разработка программ под автокад - это было хобби. Сейчас мне просто некогда - это раз, а два - мне сложнее, потому-что нет постоянного опыта.
Программой уже пользуются. Там просто некоторые разделы не доделаны, т.к. зависят от заказчика
Цитировать
В третьих, перелопачивать чужой код, особенно если он написан через одно место, не имеет надлежащих комментариев и не документирован - это занятие неблагодарное, глупое и заведомо бесполезное: в этом случае проще самому с нуля писать, чем пытаться разобраться в чужом "творчестве". Твоего кода я не видел, возможно, что он и идеален... :).
В принципе старое практически и перелапачивать не нужно особо - нужно, можно сказать, делать новое.
Идеальных кодов не существует! Каждый пишет по своему.
Могу привести пример:
using System;
using System.Collections;
using System.Collections.Generic;
using System.Drawing;
using System.Globalization;
using System.IO;
using System.Runtime.InteropServices;
using System.Windows.Forms;
using System.Xml;

namespace SEToolbar.NKUwins
{
    public partial class NKUsub_1 : Form
    {
        private static readonly string BaseDir = SettingsFile.GetSettings("BasePath");

        public NKUsub_1()
        {
            InitializeComponent();
            // Первичное распределение
            FillComboBoxByFolderNames(Path.Combine(BaseDir, "НКУ\\Первичное распределение"), this.CbDevice_1);
        }
        // Закрыть окно
        private void PbClose_Click(object sender, EventArgs e)
        {
            this.Close();
        }
        // Первичное распределение - выбор устройства
        private void CbDevice_1_SelectedIndexChanged(object sender, EventArgs e)
        {
            if (((ComboBox)sender).SelectedIndex != -1)
            {
                // Заполняем типы
                FillComboBoxByFolderNames(
                    SEHelpers.CombineAsPath(BaseDir, "НКУ\\Первичное распределение",
                                            ((ComboBox) sender).SelectedItem.ToString()),
                    this.CbType_1);
            }
        }
        // Первичное распределение - Выбор типа
        private void CbType_1_SelectedIndexChanged(object sender, EventArgs e)
        {
            if (((ComboBox)sender).SelectedIndex != -1)
            {
                // Заполняем ток
                FillComboBoxByFolderNames(
                    SEHelpers.CombineAsPath(BaseDir, "НКУ\\Первичное распределение",
                                            this.CbDevice_1.SelectedItem.ToString(),
                                            ((ComboBox) sender).SelectedItem.ToString()),
                    this.CbAmp_1);
                FillDescr();
            }
        }
        // Первичное распределение - нажатие кнопки "Выбрать"
        private void BtSel_1_Click(object sender, EventArgs e)
        {
            string path = SEHelpers.CombineAsPath(
                    BaseDir, "НКУ\\Первичное распределение",
                    this.CbDevice_1.SelectedItem.ToString(),
                    this.CbType_1.SelectedItem.ToString(),
                    this.CbAmp_1.SelectedItem.ToString());
            //this.Close();
            OpenSelectItemWindow(path, this.CbAmp_1.SelectedItem.ToString());
        }
        private void OpenSelectItemWindow(string path, string amp)
        {
            try
            {
                // Проверяем, что по указанному пути находится файл detail.xml

                string detailFile = Path.Combine(path, "detail.xml");
                if (File.Exists(detailFile))
                {
                    // Далее проверяем, что путь указанный в файле совпадает
                    XmlDocument detDoc = new XmlDocument();
                    detDoc.Load(detailFile);
                    if (path.Equals(
                        BaseDir + detDoc.DocumentElement.GetAttribute("path"))
                        )
                    {
                        // Проверка доступности
                        XmlAttribute xatr = detDoc.DocumentElement.Attributes["avail"];
                        if(xatr != null)
                            if (xatr.Value.Equals("0"))
                            {
                                MessageBox.Show("Не доступно в данной версии!");
                                return;
                            }
                        // Заголовок берем из файла
                        string winHead = string.Empty;
                        xatr = detDoc.DocumentElement.Attributes["winHead"];
                        if (xatr != null)
                            winHead = xatr.Value;
                        // Берем из файла значения ширины столбцов
                        List<int> widths = new List<int> { 50, 120, 60, 160, 150, 100 };
                        for (int k = 0; k < widths.Count; k++)
                        {
                            xatr = detDoc.DocumentElement.Attributes["col" + k.ToString(CultureInfo.InvariantCulture)];
                            if (xatr != null)
                            {
                                int w;
                                if (int.TryParse(xatr.Value, out w))
                                    widths[k] = w;
                            }
                        }
                        // Если все верно, то открываем окно выбора
                        this.Hide();
                        NKUitem win = new NKUitem(winHead, detDoc, path, widths);
                        win.FormClosed += delegate { this.Show(); };
                        win.Show();
                    }
                    else
                        MessageBox.Show("Свойства файла " + detailFile +
                                        " не соответствуют указанным параметрам выбора!" + Environment.NewLine +
                                        "Обратитесь к администратору");
                }
                else MessageBox.Show("Файл " + detailFile + " не найден!");
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }
        // Заполнение ComboBox именами папок по указанному пути
        // Если в указанной папке нет подпапок - делаем его неактивным
        private void FillComboBoxByFolderNames(string path, ComboBox cb)
        {
            //cb.Items.Clear();
            cb.DataSource = null;
            string[] dirs = Directory.GetDirectories(path, "*", SearchOption.TopDirectoryOnly);
            if (dirs.Length == 0)
            {
                cb.SelectedIndex = -1;
                cb.Enabled = false;
            }
            else
            {
                List<string> lst = new List<string>();
               
                cb.Enabled = true;
                foreach (string dir in dirs)
                {
                    DirectoryInfo di = new DirectoryInfo(dir);
                    lst.Add(di.Name);
                    //cb.Items.Add(di.Name);
                }
                lst.Sort(new StringLogicalComparer());
                if (cb.Name.Equals("CbType_1"))
                {
                    lst.Reverse();
                }
                cb.DataSource = lst;
                cb.SelectedIndex = 0;
            }
        }
        // Comparer:
        public class StringLogicalComparer : IComparer, IComparer<string>
        {
            [DllImport("shlwapi.dll", CharSet = CharSet.Unicode, ExactSpelling = true)]
            public static extern int StrCmpLogicalW(string x, string y);
            public int Compare(object x, object y)
            {
                return StrCmpLogicalW(x.ToString(), y.ToString());
            }
            public int Compare(string x, string y)
            {
                return StrCmpLogicalW(x, y);
            }
        }
        // Отображение описания
        private void FillDescr()
        {
            try
            {
                // Проверяем наличие файла с описанием
                string file = Path.Combine(BaseDir, "Desc.xml");
                if (File.Exists(file))
                {
                    string desc = string.Empty;
                    string desc2 = string.Empty;
                    // Открываем его
                    XmlDocument descFile = new XmlDocument();
                    descFile.Load(file);
                    // Открываем главную группу
                    foreach (XmlElement xml1 in descFile.DocumentElement.GetElementsByTagName("main"))
                    {
                        if (xml1.Attributes["name"].Value.Equals("НКУ"))
                        {
                            // Открываем подгруппу
                            foreach (XmlElement xml2 in xml1.GetElementsByTagName("group"))
                            {
                                if (xml2.Attributes["name"].Value.Equals("Первичное распределение"))
                                {
                                    foreach (XmlElement xml3 in xml2.GetElementsByTagName("subgroup"))
                                    {
                                        if (xml3.Attributes["name"].Value.Equals(this.CbDevice_1.SelectedItem.ToString()))
                                        {
                                            desc += xml3.Attributes["desc"].Value;
                                            foreach (XmlElement xml4 in xml3.GetElementsByTagName("item"))
                                            {
                                                if (xml4.Attributes["name"].Value.Equals(this.CbType_1.SelectedItem.ToString()))
                                                {
                                                    desc2 += xml4.Attributes["desc"].Value;
                                                    break;
                                                }
                                            }
                                            break;
                                        }
                                    }
                                    break;
                                }
                            }
                            break;
                        }
                    }
                    this.TbDescr.Text = !string.IsNullOrEmpty(desc) ? desc : string.Empty;
                    this.TbDescr_2.Text = !string.IsNullOrEmpty(desc2) ? desc2 : string.Empty;
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message + ex.StackTrace);
            }
        }

        #region win move
        private void MainWin_Load(object sender, EventArgs e)
        {
            this.MouseDown += new MouseEventHandler(AppFormBase_MouseDown);
            this.MouseMove += new MouseEventHandler(AppFormBase_MouseMove);
            this.MouseUp += new MouseEventHandler(AppFormBase_MouseUp);

        }
        void AppFormBase_MouseDown(object sender, MouseEventArgs e)
        {
            if (e.Button != MouseButtons.Left)
            {
                return;
            }
            downPoint = new Point(e.X, e.Y);
        }

        void AppFormBase_MouseMove(object sender, MouseEventArgs e)
        {
            if (downPoint == Point.Empty)
            {
                return;
            }
            Point location = new Point(
                this.Left + e.X - downPoint.X,
                this.Top + e.Y - downPoint.Y);
            this.Location = location;
        }

        void AppFormBase_MouseUp(object sender, MouseEventArgs e)
        {
            if (e.Button != MouseButtons.Left)
            {
                return;
            }
            downPoint = Point.Empty;
        }

        public Point downPoint = Point.Empty;
        #endregion
    }
}

Оффлайн Владимир Шу

  • ADN Club
  • *****
  • Сообщений: 624
  • Карма: 158
    • ПГСу Бложик
Re: Требуется программист
« Ответ #4 : 10-04-2014, 16:20:23 »
не имеет надлежащих комментариев и не документирован - это занятие неблагодарное, глупое и заведомо бесполезное

Могу привести пример: далее код с минимумом комментариев

Андрей Бушман, шаман и пророк, однако  8)

ЗЫ.
То же попробую по шаманить ...
В коде говорится что московская фирма называется "НКУ-что то там"  ;)

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Требуется программист
« Ответ #5 : 10-04-2014, 16:28:11 »
Хорош флудить, а то тему снесу. Тем более, что пока не решили, что с такими темами делать.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Александр Пекшев aka ModisАвтор темы

  • ADN Club
  • *****
  • Сообщений: 1658
  • Карма: 366
  • Отец modplus.org
    • ModPlus
Re: Требуется программист
« Ответ #6 : 10-04-2014, 16:43:58 »
Вообще удручают такие вот вещи :(
Сразу все воспринимается в штыки и не всерьез. Сразу все себя воспринимают "программистами от Бога" и все, что тут люди приводят в пример - это "говнокод"... Печально.
А с Андреем уже как-то обсуждал этот вопрос - про то, что одни делают, а другие - умные - флудят на форумах. Я может и не мегапрограммист, но вот мой продукт заинтересовал много людей и мне были предложения на разработку. Ну вот нет у меня времени этим заниматься.
Главное, что я получил отклик на свое предложение отдать проект. Поэтому одни будут дальше флудить на форумах, а другие иметь подработку

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Требуется программист
« Ответ #7 : 10-04-2014, 16:47:05 »
Главное, что я получил отклик на свое предложение отдать проект.
Так вопрос уже решился? Честно говоря тема совсем в этом разделе не к месту. Единственно что её здесь оправдывает - это .NET и отсутствие специального раздела на этом форуме.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Александр Пекшев aka ModisАвтор темы

  • ADN Club
  • *****
  • Сообщений: 1658
  • Карма: 366
  • Отец modplus.org
    • ModPlus
Re: Требуется программист
« Ответ #8 : 10-04-2014, 16:50:37 »
Цитировать
Так вопрос уже решился? Честно говоря тема совсем в этом разделе не к месту. Единственно что её здесь оправдывает - это .NET и отсутствие специального раздела на этом форуме.
Нет, вопрос еще не решился. Человек обдумывает предложение. Прошу разрешения повисеть теме еще денек - потом можно сносить. Я согласен, что тема "не в тему", но вариантов не много

Сорри за оффтоп
Цитировать
ЗЫ.
То же попробую по шаманить ...
В коде говорится что московская фирма называется "НКУ-что то там"  ;)
НКУ - низковольтное комплектное устройство

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Требуется программист
« Ответ #9 : 10-04-2014, 16:54:52 »
Прошу разрешения повисеть теме еще денек - потом можно сносить.
Ладно. До понедельника пусть повисит.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн xSAKABSx

  • ADN Club
  • Сообщений: 36
  • Карма: 1
Re: Требуется программист
« Ответ #10 : 11-04-2014, 11:50:26 »
Прошу разрешения повисеть теме еще денек - потом можно сносить.
Ладно. До понедельника пусть повисит.

Александр, просто надо отдельную тему по коммерцию завести и все  =)