0 / 0 / 0 Регистрация: 10.03.2023 Сообщений: 2 |
|
1 |
|
Консольное приложение для работы с сотрудниками10.03.2023, 17:37. Показов 615. Ответов 3
Сложная задача с++ Необходимо реализовать КОНСОЛЬНОЕ приложение, которое
0 |
Модератор 3358 / 2132 / 350 Регистрация: 13.01.2012 Сообщений: 8,311 |
|
12.03.2023, 07:58 |
2 |
Senfer_r, какая именно часть этой деятельности вызывает трудности? чисто гипотетически: наверное нужно определить структуру для хранения информации о сотруднике, список таких структур и методы сохраняющие/загружающие его в/из файла, создать простейшее консольное «меню» в виде предложения выбрать номер пункта с действием (добавление, удаление, поиск, возможно еще полный список хотя этого нет в задании), после выбора пункта запросить нужные данные и вывести результат
0 |
Senfer_r 0 / 0 / 0 Регистрация: 10.03.2023 Сообщений: 2 |
||||
12.03.2023, 10:25 [ТС] |
3 |
|||
Вот что у меня получилось, теперь вопрос как сделать чтобы было несколько сотрудников и из них можно было вызывать любого по ФИО?
0 |
Модератор 3358 / 2132 / 350 Регистрация: 13.01.2012 Сообщений: 8,311 |
|
12.03.2023, 13:42 |
4 |
Senfer_r, если вы имеете ввиду что нужно найти не по полному соответствию ФИО а по частичному то можно делать strstr вместо strcmp
0 |
IT_Exp Эксперт 87844 / 49110 / 22898 Регистрация: 17.06.2006 Сообщений: 92,604 |
12.03.2023, 13:42 |
4 |
Задание
Реализовать на языке программирования Python консольное приложение, которое выводит сведения о сотрудниках. Приложение должно выводить информацию о сотруднике, отделе в котором он работает и его зарплату. Кроме того, должна выводится общая сумма зарплаты по отделу, а также нужно вывести ФИО всех сотрудников отдела.Также необходимо разработать версию с GUI-интерфесом. В качестве графического интерфейса использовать Tkinter.
Функционал программы
- добавление сотрудника
- редактирование сотрудника
- удаление сотрудника
- поиск по сотруднику
- обновление или перезагрузка данных.
Данный функционал указан для приложения с графическим интерфейсом. Функционал консольной версии описан в задании.
Фрагмент программного кода (часть консольной версии)
# используется для сортировки from operator import itemgetter class Emp: """Сотрудник""" def __init__(self, id, fio, sal, dep_id): self.id = id self.fio = fio self.sal = sal self.dep_id = dep_id class Dep: """Отдел""" def __init__(self, id, name): self.id = id self.name = name class EmpDep: """Сотрудники отдела для реализации связи многие-ко-многим""" def __init__(self, dep_id, emp_id): self.dep_id = dep_id self.emp_id = emp_id if __name__ == '__main__': main()
Фрагмент программного кода (часть версии с GUI)
import tkinter as tk from tkinter import ttk import sqlite3 # Класс Main class Main(tk.Frame): def __init__(self, root): super().__init__(root) self.init_main() self.db = db self.view_records() # Главное окно def init_main(self): toolbar = tk.Frame(bg='beige', bd=2) toolbar.pack(side=tk.TOP, fill=tk.X) self.add_img = tk.PhotoImage(file='add.png') btn_open_dialog = tk.Button(toolbar, text='Добавить сотрудника ', command=self.open_dialog, bg='beige', bd=0, compound=tk.TOP, image=self.add_img) btn_open_dialog.pack(side=tk.LEFT) self.update_img = tk.PhotoImage(file='edit.png') btn_edit_dialog = tk.Button(toolbar, text='Редактировать', bg='beige', bd=0, image=self.update_img, compound=tk.TOP, command=self.open_update_dialog) btn_edit_dialog.pack(side=tk.LEFT) self.delete_img = tk.PhotoImage(file='delete.png') btn_delete_dialog = tk.Button(toolbar, text='Удалить', bg='beige', bd=0, image=self.delete_img, compound=tk.TOP, command=self.delete_records) btn_delete_dialog.pack(side=tk.LEFT) self.search_img = tk.PhotoImage(file='search.png') btn_search = tk.Button(toolbar, text='Поиск', bg='beige', bd=0, image=self.search_img, compound=tk.TOP, command=self.open_search_dialog) btn_search.pack(side=tk.LEFT) self.refresh_img = tk.PhotoImage(file='refresh.png') btn_refresh = tk.Button(toolbar, text='Обновить', bg='beige', bd=0, image=self.refresh_img, compound=tk.TOP, command=self.view_records) btn_refresh.pack(side=tk.LEFT) self.tree = ttk.Treeview(self, columns=('ID', 'employee', 'position', 'salary'), height=15, show='headings') self.tree.column('ID', width=30, anchor=tk.CENTER) self.tree.column('employee', width=365, anchor=tk.CENTER) self.tree.column('position', width=150, anchor=tk.CENTER) self.tree.column('salary', width=100, anchor=tk.CENTER) self.tree.heading('ID', text='ID') self.tree.heading('employee', text='Сотрудник') self.tree.heading('position', text='Должность') self.tree.heading('salary', text='Зарплата') self.tree.pack(side=tk.LEFT) scroll = tk.Scrollbar(self, command=self.tree.yview) scroll.pack(side=tk.LEFT, fill=tk.Y) self.tree.configure(yscrollcommand=scroll.set) # Добавление данных def records(self, employee, position, salary): self.db.insert_data(employee, position, salary) self.view_records() # Основной код для запуска if __name__ == "__main__": root = tk.Tk() db = DB() app = Main(root) app.pack() root.title("Staff") root.geometry("665x450+300+200") root.resizable(False, False) root.mainloop()
Скриншот архива с проектом
Пояснения по запуску программы
Скачать и установить Python с офф. сайта. Скачать и установить с офф. сайта iIDE PyCharm Community. Запустить проект. Запустить сперва файл main.py и посмотреть на его работу. Запустить файл staff.py и посмотреть на его работу.
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; namespace _2project { public partial class Form2 : Form { public Form2() { InitializeComponent(); } public string TextForm { get { return label1.Text; } set { label1.Text = value; } } public string TextForm1 { get { return label2.Text; } set { label2.Text = value; } } public string TextForm2 { get { return label3.Text; } set { label3.Text = value; } } private void Form2_Load(object sender, EventArgs e) { } private void label1_Click(object sender, EventArgs e) { } } }
Разработка программы для хранения и вывода списка сотрудников и их зарплаты
Курсовая
работа
по
курсу «Основы алгоритмизации и программирования»
на
тему: «Разработка программы для хранения и вывода списка сотрудников и их
зарплаты»
Введение
Написать программу, в которой необходимо создать
структуру, элементами которой являются фамилия сотрудника и его зарплата.
Объявить массив данных о сотрудниках типа структуры и ввести значения его
элементов. Определить суммарный заработок сотрудников и сотрудника, у которого
максимальная зарплата. Предусмотреть меню. Результаты работы программы записать
в файл.
Данная программа предназначена для хранения и
вывода списка сотрудников предприятия и их зарплаты. Метод, реализованный в
задании, а так же саму программу, можно применять в различных отраслях, так
например, в обучении так и в небольших организациях, для создания баз данных
учеников, сотрудников, клиентов и т.д.
В программе предусмотрен, возможности записи
новых сотрудников и их зарплаты, вывод списка сотрудников и вывод общую суммы
заработка, поиск сотрудника с самой большой заработной платой, вывод всех
данных в файл.
Курсовая работа состоит из программы, созданной
на языке программирования Microsoft Visual C++ консольное приложение (Win 32
Console Application).
1. ТЕОРЕТИЧЕСКИЕ ОСНОВЫ
1.1 Работа с файлами
Запись в файл и чтение в c++ почти ничем не
отличаются от стандартного ввода и вывода. Вместо cin и cout надо будет указать
«файл», из которого вы читаете.
Для работы программы надо подключить header-файл
fstream:
#include <fstream>
Для того чтобы открыть файл:
ofstream
out;.(«file.type»);
if (out==NULL)
return 0; // если не смогли открыть файл
Теперь для записи вывода в файл достаточно
писать вместо cout идентификатор out
out<<«this string
was wrote to file by c++;)»<<endl;
Дополнительные функции:
· is_open() — проверят, открыт ли
файл. Если открыт возвращает 1 иначе 0 (true or false)
· skeek(kuda) — перемещает позицию с
которой мы будем писать.
· tellp() — выдает позицию, в которой
мы находимся
· close() — закрывает файл
Чтение из файла почти ничем не отличается.
Вместо ofstream пишем ifstream и для ввода используем оператор >>
ifstream
somefile;.(«file.txt»);
string s;>>s;
Дополнительные функции:
· is_open() — проверят, открыт ли
файл. Если открыт возвращает 1 иначе 0 (true or false)
· eof() — возвращает true если дошли
до конца файла
· seekg(kuda) — перемещает позицию с
которой мы считаем в заданное место.
· tellg() — выдает позицию, в которой
мы находимся
· close() — закрывает файл
Запись и чтение из файла:
Для этого вам надо создать экземпляр класса
fstream:
fstream file;.open(file,»параметры
через
|»);
и можно будет и читать и писать в файл. Немного
подробнее про параметры:
· ios::in — открыть файл для чтения
· ios::out — открыть для записи с
начала файл
· ios::app — открыть для дозаписи в
конец файла
· ios::ate — установить указатель (где
мы щас находимся в файле) в конец файла
· ios::thrunc — очистить файл если он
существует
· ios::binary — открыть файл в
бинарном формате (типа exe,dll,o и т.д, не думаю, что вам в ближайшем будущем
понадобится)
Для вывода file<<chto_vivesti и для чтения
file>>
1.2 Структуры
Структура это совокупность переменных,
объединенных под одним именем. С помощью структур удобно размещать в смежных
полях связанные между собой элементы информации. Объявление структур создает
шаблон, который можно использовать для создания ее объектов, то есть
экземпляров этой структуры. Переменные, из которых состоит структура,
называются членами. Члены структуры еще называют элементами или полями.
Как правило, члены структуры связаны друг с
другом. Например, элемент списка рассылки, состоящий из имении адреса, логично
представить в виде структуры. В объявлении структуры используется ключевое
слово struct. Оно сообщает компьютеру, что объявляется (декларируется)
структура.
struct addr
{name[30];street[40];city[20];state[3];long
int zip;
};
Объявление структуры завершается точкой с
запятой. Это потому, что объявление структуры является оператором. Кроме того,
тег структуры addr идентифицирует эту конкретную структуру данных и является
спецификатором ее типа.
В данном случае на самом деле никакая переменная
не создается. Всего лишь определяется вид данных. Когда Вы объявляете
структуру, то определяете агрегатный тип, а не переменную. И пока Вы не
объявите переменную этого типа, то существовать она не будет. Чтобы объявить
переменную типа addr, то есть физический объект, необходимо написать следующее:
addr addr_info;
В этом операторе объявлена переменная типа addr,
которая называется addr_info. Таким образом, addr описывает вид структуры (ее
тип), а addr_info является экземпляром (объектом) этой структуры. Когда
объявляется переменная-структура, компилятор автоматически выделяет количество
памяти, достаточное для того, чтобы разместить все ее члены.
1.3
Массивы
В C++ можно определить массив любого типа.mas[3];
Описан массив из 3 целых чисел. Нумерация в
массивах начинается с 0-го элемента. Поэтому массив mas содежит: mas[0],
mas[1], mas[2]
Массив можно инициализировать при описании. В
этом случае нет необходимости указывать его размер.mas[]={23, 25, 81};
Далее создан массив mas из 3-х элементов:[0]=
23, mas[1]= 25, mas[2]= 81.
Кроме стандартного доступа к элементам массива
C++ обеспечивает еще один. В C++ имя массива представляет собой не только имя,
которое вы используете в своих программах, но и является адресом, по которому в
памяти находится первый элемент массива. Поэтому к элементам массива можно
обращаться следующими способами:m[6] = {4, 3 , 1, 4, 7, 8 };[3] или (m + 3)[0]
Обращение к 4-му элементу массива.
Возможны и другие варианты:
(m + 0)[3]; (m + 2)[1]; (m — 2)[5]
Наиболее полезно использовать такой подход к
массивам, содержащим символьные строки.
1.4 Многомерные массивы
Многомерные массивы — это массивы с более чем
одним индексом.
Чаще всего используются двумерные массивы.
При описании многомерного массива необходимо
указать C++, что массив имеет более чем одно измерение.
В памяти многомерные массивы представляются как
одномерный массив, каждый из элементов которого, в свою очередь, представляет
собой массив.
Второй способ инициализации при описании
массиваа[3][2]={ {4,1}, {5, 7}, {2, 9} };
Обращение к элементу массива производится через
индексы. cout<< а[0][0];
При передаче массива в функцию всегда происходит
передача его адреса. Т.о. в C++ все массивы передаются по адресу.
Принимающая функция получает не весь массив, а
только адрес первого элемента массива.
Указатели — это переменные, которые содержат
адрес адреса данных. В С++ указатели могут быть на любой тип данных.
Если необходимо, можно описать массив
указателей.*ip[ 10 ];
массив указателей на целые значения из 10
элементов.
С указателем можно производить некоторые
арифметические операции. Например, при работе с массивами.
2. ОПИСАНИЕ ПРОГРАММЫ
.1 Описание разработанной структуры
struct
sotr
{
char
F[20];
double
Z;
}Data[100];
Структура sotr содержит 2 элемента: char
F[20] для хранения
фамилии сотрудника. double
Z для хранения
размера зарплаты.
Для программы создаётся массив структур Data[100];
2.2 Логика работы программы
При запуске программы вызывается функция neworg()
заполнения массива структур:
После создания базы, в зависимости от того что
выбрал пользователь в меню вызываются функции:
Функция нахождения суммарной зарплаты sum();
Функция нахождения сотрудника с максимальной
зарплатой smax();
Функция сохранения результата работы программы
save();
2.3 Схема алгоритма функции MAIN()
3. РУКОВОДСТВО ПОЛЬЗОВАТЕЛЮ
3.1 Начало работы
Для начала работы с базой сотрудников,
необходимо её создать, поэтому после запуска программа предложит ввести
количество сотрудников (Рис. 1), данные о которых после этого необходимо будет
заполнить (Рис. 2).
Рис. 1
Рис. 2
После заполнения базы, программа выведет меню, в
котором предложит действия, которые можно выбрать, введя его порядковый номер (Рис.
3).
Рис. 3
3.2
Определение суммарного заработка
Для того чтобы определить суммарный заработок
введите «1».
Программа выведет на экран сумму зарплат всех
сотрудников занесённых в базу (Рис. 4).
Рис. 4
3.3 Определение сотрудника с
наибольшей зарплатой
Для того чтобы программа нашла самого
оплачиваемого сотрудника введите «2». Программа сравнит зарплаты всех
сотрудников и выведет на экран фамилию самого оплачиваемого (Рис. 5).
Рис. 5
3.4 Сохранение работы
Перед тем как выйти из программы или создать
новую базу рекомендуется сохранить работу программы, для этого введите «3».
Программа сохранит данные в файле SaveOrg.txt (Прил. 2)
.5 Создание новой базы
Если база была введена неверно или необходимо
создать новую базу введите «4». Программа удалит настоящую базу и создаст
новую. Вам необходимо будет ввести количество сотрудников в новой базе (Рис.
1). А затем заполнить данные (Рис. 2).
.6 Выход
Для выхода из программы введите «5». Все не
сохранённые данные будут удалены.
ЗАКЛЮЧЕНИЕ
Запуск программы показал, что её использование
довольно удобно, меню интуитивно понятно. Программа правильно считает суммарную
зарплату и вычисляет сотрудника с максимальной зарплатой. Результат работы
сохраняется в файл.
ЛИТЕРАТУРА
1. А.И.
Касаткин. Профессиональное программирование на языке C:
От TurboC к BorlandC++.
— Мн.: Выш. шк., 1992.
2. Б.В.
Керниган,Д.М. Ричи. ЯЗЫК С. — М.: Софт, 1995.
. Б.
Страуструпп. Язык программирования C++.
— М.: Софт, 1999.
. В.А.
Скляров. Программное и лингвистическое обеспечение персональных ЭВМ. Справочное
пособие в 2-х т. — Мн.: Выш. Шк., 1992.
. Н.
Культин. C/C++
в задачах и примерах. — СПб.: БХВ-Петербург, 2001.
. У.
Сэвитч. C++ в примерах. —
М.:Эком, 1997.
. Х.М.
Дейтл, П.Дж. Дейтл. Как программировать на C.
-М.: ЗАО “Издательство БИНОМ”, 2000.
ПРИЛОЖЕНИЕ 1
Листинг программы
#include <iostream.h>
#include <windows.h>
#include <fstream.h>sotr
{F[20];Z;
}Data[100];n,max=0;zsum=0;neworg()
{<<«Kolichestvo
sotrudnikov > «;>>n;(int i=0;i<n;i++)
{<<i+1<<» Vvedite
familiu > «;>>Data[i].F;<<i+1<<» Vvedite
zarplatu > «;>>Data[i].Z;
}
{=0;(int
i=0;i<n;i++)(Data[max].Z<Data[i].Z)max=i;<<«Maximalnaia
zarplata y :»<<endl;<<Data[max].F<<endl;
}sum()
{=0;(int
i=0;i<n;i++)=zsum+Data[i].Z;<<«Obshaja zarplta =
«<<zsum<<endl;
}save()
{save(«SaveOrg.txt»);(int
i=0;i<n;i++)<<Data[i].F<<«»<<Data[i].Z<<endl;<<»
Obshaja zarplta =»<<zsum<<endl;<<«Maximalnaia
zarplata u :»<<endl;<<Data[max].F<<endl;
}main()
{k;();(true)
{<<«opredelit’ summarnii
zarabotok «<<«1″<<endl;<<«opredelit’
sotrudnika s max zarplatoi
«<<«2″<<endl;<<«sohranit’ rezultat
«<<«3″<<endl;<<«Novii spisok
«<<«4″<<endl;<<«Vijti iz programmi
«<<«5″<<endl;<<«> «;>>k;(k)
{1: sum();
break;2:smax();break;3:save();break;4:neworg(); break;
default: exit(1);
}
}
}
ПРИЛОЖЕНИЕ 2
массив программа алгоритм структура
Распечатки результатов из файла
Ivanov54000
Ptrov30000
Sidorov70000
Fedorov10000
Obshaja zarplta =164000zarplata u:
Система учета сотрудников
Клиент-серверная система учета сотрудников
Система состоит из следующих компонентов:
- Серверная часть, реализованная с помощью ASP.NET
- Клиентская чать, реализованная с помощью .NET Framework 4.6.1 и WinForms
- База данных SQLite
Для демонстрации работы системы, открыв файл решения «WebServer_.sln», соберите и запустите проект «WebServer_» (сервер), затем соберите и запустите проект «ClientWinForms» (клиент).
Программа обладает следующим функционалом:
- Добавление сотрудников в базу
- Просмотр всех сотрудников
- Удаление сотрудника
- Поиск сотрудников по параметрам
Интерфейс клиента
Главное окно:
Настройки URL сервера:
Добавление сотрудника:
Поиск сотрудников по параметрам:
Результат поиска по параметрам из предыдущего слайда:
Удаление сотрудника:
Некоторые компании разрабатывают программную систему специально для своих рекрутеров. Это технологически непростая задача.
Я знаю, как ее решать в деталях и какие нюансы нужно учесть, поскольку руководил разработкой «с нуля» успешной облачной и корпоративной системы для найма.
Прочитав эту статью, вы узнаете:
- Функциональные требования к современному ПО для подбора персонала;
- Требования к безопасности;
- Некоторые технические рекомендации;
- Нюансы поддержки и дальнейшего развития;
- Рекомендации о том, что нужно сделать перед началом разработки;
- Как можно облажаться.
Надеюсь, статья поможет эффективнее спланировать ресурсы для такой задачи, сделать ее лучше и быстрее.
Что такое система для рекрутинга?
Рекрутеры — это люди, подбирающие персонал.
Система для автоматизации рекрутинга — это программное решение, в котором рекрутеры могут:
- Удобно вести рабочую базу кандидатов и вакансий;
- Работать совместно, разделять ответственность и устанавливать напоминания;
- Упростить и автоматизировать ведение базы данных и подбор персонала.
Рекрутеры ведут свою базу кандидатов, чтобы сохранять контакты, историю общения и результаты по каждому претенденту на вакансии.
Ведение базы данных должно быть быстрым, легким и не требовать лишних действий от пользователей. Иначе трудоемкость работы с базой нивелирует все плюсы других функций автоматизации.
Какой должна быть система? Требования.
I. Минимальные функциональные требования
Требования, без которых систему не стоит запускать:
1. Добавление в базу и редактирование данных по вакансиям, кандидатам, заказчикам. Возможность написания комментариев по ним.
2. Поиск вакансий и кандидатов по нескольким параметрам.
3. Лёгкость ведения базы данных. Эта важнейшая функция сводится в основном к простоте и скорости добавления кандидатов в систему: рекрутеры добавляют в базу сотни резюме в месяц.
Кандидатов можно добавить в систему из:
- файлов резюме в электронном виде;
- онлайн-профиля в LinkedIn;
- онлайн-резюме на сайтах поиска работы.
В идеале, эти действия должны быть «в один клик». Сделать это достаточно сложно. Но если рекрутеры не смогут быстро наполнять базу данных, все дальнейшие преимущества от такой системы не покроют этот недостаток.
А что, если рекрутеры получили 30-200 откликов по вакансии на сайте поиска работы? Переносить их в систему вручную — трудоемко, даже если требуется перенести лишь часть из них. Если же переносить в базу не всю информацию, это отразится на дальнейшей эффективности работы.
В некоторых компаниях рутинной работой занимается отдельный человек. Это может быть решением. Но дополнительному сотруднику надо платить деньги, он не так быстр, как программа, а также присутствует «человеческий фактор».
Я специально привел аргументы и примеры, т. к. выполнение или не выполнение этого пункта определяет успех или провал системы. Сейчас есть много облачных программ для рекрутинга, а также решений, разработанных специально под конкретную компанию. Многие потерпели крах именно из-за пренебрежения парсингом резюме (автоматический перенос данных системой из загруженных файлов) и интеграцией с LinkedIn, сайтами поиска работы, электронной почтой.
4. Защита от дублирования кандидатов (их резюме) в базе.Не стоит недооценивать важность и сложность этой задачи. Ниже расскажу почему.
5. Совместная работа команды нанимателей с общей базой вакансий и кандидатов. Это включает возможность назначать ответственных рекрутеров по конкретным вакансиям и кандидатам.
6. Возможность управления полномочиями пользователей и ограничивать некоторые функции, чтобы избежать ошибок или удаления важной информации.
7. Фиксирование истории каждого действия пользователями в системе.Это позволяет формировать отчеты о проделанной работе, статистику по работе рекрутеров и закрытию вакансий, а также точно знать, кто, что и когда именно сделал.
II. Обязательные функциональные требования
Очень важные. Без их выполнения можно запустить систему и какое-то время работать, принимая обратную связь от пользователей. Но без них система неполноценна и оставляет рекрутерам много «ручных» рутинных действий. Эти требования лучше выполнить еще до запуска или в кратчайшие сроки после запуска.
1. Полнотекстовый поиск по файлам резюме.
2. Уведомления о важных действиях и событиях на почту и в интерфейсе.
3. Интеграция с онлайн-календарем (Google Calendar, Outlook, и т.д.).
4. Удобные и настраиваемые этапы для кандидатов по вакансии (workflow вакансии) и причины отказов кандидатов.
5. Интеграция с email:
- перенос в базу данных резюме, которые пришли рекрутеру на email;
- сохранение истории email-переписки с кандидатами на их страницах в системе;
- возможность автоматически отправить кандидату напоминание о собеседовании с адресом и картой проезда.
6. Отчеты о проделанной работе по вакансии.
7. Отчет по результатам работы каждого рекрутера за конкретный период.
8. Поиск по ФИО кандидата с транслитерацией, как умеет Facebook.
9. Понятное, «интуитивное» взаимодействие с программой (и весь UX интерфейса в целом).
Когда система усложняется, усложняется и внедрение функций. Как все правильно разместить в интерфейсе, подписать, правильно расставить акценты, чтобы все функции были понятны и под рукой? Нужно выдать пользователям мощные и удобные функции и в то же время не перегрузить интерфейс.
III. Продвинутые требования
Они нужны для увеличения эффективности работы. Для некоторых компаний отдельные пункты нужно причислить к обязательным, для некоторых они пока совсем не нужны. Это зависит от потребностей вашего HR-отдела.
1. Отчет по источникам появления кандидатов.
2. Расчет средней зарплаты по кандидатам, отобранным на вакансию.
3. Возможность опубликовать вакансию в соцсетях в один клик. Также отдельная страница вакансии, с которой кандидаты отправляют резюме напрямую в систему.
4. Страница со всеми вакансиями компании, которую можно удобно внедрить на корпоративном сайте.
5. Возможность дать заказчику доступ к вакансиям в программе, чтобы он мог просматривать все отобранные резюме и отмечать по ним решения без общения с рекрутером.
6. Матчинг (автоматические рекомендации) подходящих кандидатов: система определяет в базе наиболее подходящих под заданные требования вакансии кандидатов по их резюме и предлагает рекрутеру.
7. Массовая загрузка новых резюме в базу в виде архива с файлами резюме.
8. Ведение задач по кандидатам и вакансиям с напоминаниями.
9. Мобильное приложение или удобная мобильная версия сайта.
10. Рассылка кандидатам вакансий на почту.
11. API для интеграции с сайтом или внутренними программами компании.
IV. Требования к безопасности
1. Шифрование паролей. С солью.
Для многих программистов и архитекторов ПО это само собой разумеется. При этом шифрование паролей многие игнорируют.
Не так давно была утечка части базы Яндекса с логинами и паролями от почты. Еще раньше у ведущих сайтов поиска работы функция «Забыли пароль?» просто присылала на почту пароль в открытом виде. Выходит, он так и хранится в базе в открытом виде. Некоторые сайты перестали так делать и выдают ссылку для смены пароля. Правда, это не значит, что пароли зашифрованы.
Зачем это делать?
Пароли в открытом виде может тайно кому-то передать или «слить» в сеть кто-то из администраторов. Руководство даже ничего не узнает о махинациях. Третьи лица могут скопировать себе данные из системы, потому что они заходят в нее по известным логинам и паролям, и им все доступно.
Я предпочитаю не надеяться на добросовестность администраторов базы, техподдержки или еще кого-то. Когда об утечке данных узнают пострадавшие, возможен огромный ущерб репутации.
Зашифрованные пароли — это профессиональный подход. Лучше не брать на себя риски утечки паролей. Если кто-то получит хорошо зашифрованные пароли, расшифровать и воспользоваться ими будет практически нереально.
2. Шифрованное SSL-соединение.
Шифрование защищает данные от перехвата. Если в адресе сайта есть «https», это значит, что данные от браузера к серверу передаются зашифрованными и их перехват будет бесполезен. Логин и пароль не смогут перехватить. Это легко и дешево сделать для любого сайта.
3. Бекапы (откаты изменений системы). Само собой.
V. Важные технические требования
1. Вечные пользовательские сессии, которые не занимают оперативную память.
Мы тоже считали, что авторизоваться заново не проблема. Но реальность такова, что пользователи любят открывать много вкладок в рабочей системе. Если при перезагрузке сервера или программы пользовательская сессия завершается во всех вкладках — это неприятность.
2. Для полнотекстового поиска по резюме нужно использовать специальный «движок».
Например, Apache Solr. Он вряд ли будет эффективно работать сразу после внедрения. Его необходимо донастраивать, проводить много тестов. Это творческая и интеллектуальная работа.
3. База данных быстро увеличивается.
Нужно строить эффективные индексы и писать эффективные SQL-запросы.
4. Программисты должны уметь находить и устранять утечки памяти.
При разработке сложных программ эта проблема возникает рано или поздно. Вероятность этого повышается, если в разработке участвовали не очень опытные разработчики. Решение проблемы включает настройку мониторинга работы ПО, тестирование сочетания разных функций, сравнение дампов памяти программы.
VI. Нюансы поддержки и развития ПО
Хороший софт для рекрутинга — это не тот случай, когда все запустили, и можно больше не вовлекаться в доработки. Перечислю основные важные моменты из своего опыта:
1. Интеграция периодически нарушается или перестает работать из-за изменений в LinkedIn, на сайтах поиска работы или в почтовых сервисах.
2. Выход новых версий браузеров вносит изменения в интерфейс пользователей. У них может что-то «поехать», перестать работать или начать выглядеть хуже.
3. Большое разнообразие вариантов резюме или вакансий приводит к тому, что периодически находятся варианты, которые имеют недостатки во внешнем виде, парсинге, рекомендациях. Приходится постоянно искать новые решения, учитывать разные нюансы, совершенствовать алгоритмы.
4. Мир не стоит на месте. Все развивается. Рекрутерам постоянно нужны новые функции. Если их не предоставлять, возможности нанимателей начинают отставать от возможностей их коллег из других компаний.
В итоге это отрицательно влияет на скорость и качество закрытия вакансий, на финансовые результаты компании. Доработки требуют отвлечения и расходов.
5. Обычные вопросы пользователей и их проблемы, которые иногда непонятно как воспроизвести. Запросы скриншотов, пояснения — все это требует вовлечения программистов.
VII. Рекомендации перед началом разработки
Для разработки «с нуля» системы для рекрутинга, которая соответствует минимальным и обязательным требованиям, может потребоваться 35-50 человеко-месяцев работы.
Я не вижу возможности реализовать этот проект более выгодно, чем купить готовое решение, даже с доработками специально для своей компании.
Что нужно сделать перед началом разработки, некоторые рекомендации:
1. Детально расписать, какие функции ПО предпочтительны и достаточны для рекрутеров. Можно отталкиваться от списка, приведенного выше.
2. Вместе с архитектором ПО рассчитать бюджет, необходимый на всю разработку, а также состав команды и срок реализации проекта.
3. Определить, чем пользоваться, пока система в разработке.
4. Запросить коммерческие предложения от узкопрофильных поставщиков систем для рекрутинга.
Возможно, вы получите выгодные предложения за хорошую готовую систему, не вовлекая трудовые и финансовые ресурсы своей компании.
VIII. Как можно облажаться
1. Потратить неприемлемо много денег.
При средней стоимости человеко-месяца для компании на уровне 1 500 USD (экономно), стоимость всей разработки составит от 52 500 до 75 000 USD. Напомню, это из расчета 35-50 человеко-месяцев работы.
Для примера: такие гиганты, как SoftServe и GlobalLogic разрабатывают свои системы для найма уже несколько лет (!).
Тут есть еще такой неприятный фактор: жалко бросать проект после того, как его долго делали и много денег вложили.
Подобные терзания испытывают неопытные игроки в покер, когда уже поставили много и продолжают повышать ставки, даже когда игра складывается не в их пользу.
2. Разрабатывать слишком долго, вынуждая рекрутинг страдать быть неэффективным все это время.
3. Делать-делать и недоделать. Или отдать рекрутерам софт в таком плачевном состоянии, что они не захотят им пользоваться.
Так бывает, когда сменяется руководство или HR-директор, которые участвовали в принятии решения о разработке.
Желаю вам успехов в этом затягивающем и увлекательном деле!
Источник :
«