前回記事では、システム開発現場で良く使われるバージョン管理システムと、RPAでバージョン管理をすることのメリットについてお話ししました。そして、以下の課題について提示しました。
- RPAはコーディングしないのにソースコード管理できるのか
- バージョン管理ツールは誰が利用するのか。どうやって教育するか。
- フローチャートベースで、ソースコードが裏で自動生成されるが故に、レビューや、差分管理がしずらいのではないか。
実際のところどうなのか、こうした課題を差し置いても導入すべきなのかを考えてみたいと思います。
可能です。多くのRPAツールは、画面上の部品をドラック&ドロップでシナリオ(ワークフロー)を作りますが、その裏側では、ロボットがシナリオを理解できるように、ソースコードが自動生成されています。いくつか例を挙げます。
| <Activity |
| mc:Ignorable="sap sap2010 sads" x:Class="Main" mva:VisualBasic.Settings="{x:Null}" |
| sap2010:WorkflowViewState.IdRef="Main_1" |
| xmlns="http://schemas.microsoft.com/netfx/2009/xaml/activities" |
| xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" |
| xmlns:mva="clr-namespace:Microsoft.VisualBasic.Activities;assembly=System.Activities" |
| xmlns:sads="http://schemas.microsoft.com/netfx/2010/xaml/activities/debugger" |
| xmlns:sap="http://schemas.microsoft.com/netfx/2009/xaml/activities/presentation" |
| xmlns:sap2010="http://schemas.microsoft.com/netfx/2010/xaml/activities/presentation" |
| xmlns:scg="clr-namespace:System.Collections.Generic;assembly=mscorlib" |
| xmlns:sco="clr-namespace:System.Collections.ObjectModel;assembly=mscorlib" |
| xmlns:ui="http://schemas.uipath.com/workflow/activities" |
| xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> |
| <Sequence DisplayName="Main" sap2010:WorkflowViewState.IdRef="Sequence_1"> |
| <ui:MessageBox Caption="{x:Null}" ChosenButton="{x:Null}" Buttons="Ok" DisplayName="Message box" sap2010:WorkflowViewState.IdRef="MessageBox_1" Text="Hello World UiPath!!" TopMost="True" /> |
| </Sequence> |
| </Activity> |
| <?xml version="1.0" encoding="UTF-8" ?> |
| <object class="GenericRobot2" serializationversion="1"> |
| <prologue> |
| <saved-by-versions> |
| <version>9.3.0</version> |
| </saved-by-versions> |
| <referenced-types> |
| <type name="Post"/> |
| </referenced-types> |
| <referenced-snippets/> |
| <typed-variables> |
| <typed-variable name="post" type-name="Post"/> |
| </typed-variables> |
| <global-variables/> |
| <parameters/> |
| <return-variables> |
| <variable name="post"/> |
| </return-variables> |
| <store-in-database-variables/> |
| <browser-engine>WEBKIT</browser-engine> |
| </prologue> |
| <property name="variables" class="Variables"> |
| <object class="Variable" serializationversion="1"> |
| <property name="name" class="String" id="0">post</property> |
| <property name="initialAssignment" class="InitialVariableAssignment"> |
| <property name="type" class="TypeReference" serializationversion="0"> |
| <property name="typeName" class="String">Post</property> |
| </property> |
| </property> |
| </object> |
| </property> |
| … |
| <Task> |
| <TaskProperties> |
| <Description /> |
| <Created>03/17/2019 15:19:23</Created> |
| <RunDuration /> |
| <TotalCommands>2</TotalCommands> |
| <TotalClicks>0</TotalClicks> |
| <TotalMouseClicks>0</TotalMouseClicks> |
| <TotalKeystrokes>0</TotalKeystrokes> |
| <RepeatType>Do Not Repeat</RepeatType> |
| <ReplaySpeedType>0</ReplaySpeedType> |
| <LastModified>03/17/2019 15:29:30</LastModified> |
| <PlayModeType>Standard</PlayModeType> |
| <IsRunWithSimilerWindows>False</IsRunWithSimilerWindows> |
| <IsNotifyEMail>False</IsNotifyEMail> |
| <Email /> |
| <PriorityType>Low</PriorityType> |
| <IsBlockKeystroke>False</IsBlockKeystroke> |
| <IsStealthMode>False</IsStealthMode> |
| <IsCapsLockOn>False</IsCapsLockOn> |
| <IsNumLockOn>False</IsNumLockOn> |
| <TaskTimeout>0</TaskTimeout> |
| <IsContentAnalyticsEnabled>False</IsContentAnalyticsEnabled> |
| </TaskProperties> |
| <Variables> |
| <Variable> |
| <Name>$answer$</Name> |
| <Type>Value</Type> |
| <Value xmlns:q1="http://www.w3.org/2001/XMLSchema" p3:type="q1:string" xmlns:p3="http://www.w3.org/2001/XMLSchema-instance"></Value> |
| </Variable> |
| </Variables> |
| <Commands> |
| <Command EventData="Prompt Message: "What your name?" in "Desktop" Assign value to Variable: $answer$"> |
| <Name>ForValue</Name> |
| </Command> |
| <Command EventData="Message Box: "こんにちは $answer$ さん""> |
| <Name>ShowMsgBox</Name> |
| </Command> |
| </Commands> |
| </Task> |
これらのRPA製品では、XML形式で構造化されたテキストデータがファイル別に生成されていますので、通常のシステム開発と基本的には同じようにソースコード管理が可能です。ただ、物理的にソースコード管理が可能だということはわかりましたが、導入したとして本当にうまく活用できるのか。誰が利用するのか。どうやって担当者を教育するのか。次の課題を検討しましょう。
まず、誰が利用するのかということですが、RPAの開発担当者、レビュー担当者が利用することになります。ただし、これまでバージョン管理ツールなど触ってこなかった担当者にGitを使うように言っても使えないでしょう。実は開発経験のある方にGitを使うようにと言っても、使ってくれないかもしれません。バージョン管理ツールは、担当者が自由に使って自由に管理するべきというものではなく、ある一定のルールや管理構成を決めて、その枠組みの中で活用するべきものだからです。そのため、具体的な運用方法は、運用規約などで明確に定義します。担当者に依存せず、誰が担当しても、同じように管理できるようにするためです。例えば運用規約に、バージョン管理に関して定義すべき内容は、以下などがあります。
- 使用するバージョン管理ツール:Git/SVN等
- 使用するクライアントツール:SourceTree/TortoiseGit/TortoiseSVN
- レポジトリ構成:1業務2レポジトリ(ドキュメント/ソース)等
- フォルダ構成:ドキュメントレポジトリのフォルダ構成(業務要件/基本設計/詳細設計/テスト)等
- ブランチの利用方針:1人で開発する場合、Master/Develop/HotFixでも良い、複数人の場合はFeatureブランチを利用する等
- レビュー(プルリクエスト、マージ)方針
- リリース(タグ)運用方針
- コミットコメントの記述方針等
これらを明確に定義し、担当者が利用に際して迷うことをなくしてあげると、後はツールの使い方を覚えてもらうだけです。幸い、GitやSVNの使い方に関するまとめサイトや書籍はいろいろと出ていますし、外部ベンダーに研修を頼むこともできるかもしれません。事務職には扱えないと導入をあきらめる前に、事務職でも扱えるようにルールやマニュアル、教育を提供することを検討しましょう。そうするとITリテラシーも上がり、いずれは事務担当者のほうから効率化の提案が出てくるかもしれません。
同じファイルを複数人が更新した場合、更新の競合が発生します。バージョン管理ツールのメリットの一つとして、競合の把握、解決ができることが挙げられます。もちろんRPAツールでも同様に競合の把握や、解決はできるのですが、いくつか問題があります。
- RPA開発は開発ツールでフローチャートを組み立てて開発しており、ソースコードを意識していない。
- ソースコードは自動生成され、IDが自動で振り直されるなど、自分が更新した箇所以外でも変更差分が発生する場合がある。
ノンコーディングツールやビジュアルコーディングツールではよくある課題です。XML構文やRPAツールに精通した方でないと、ソースコードベースで競合解決は難しいと思ったほうがいいです。対応策としては、競合しているファイルを開発ツールで同時に開き、差分を手動で取り込むしかないと思います。レビューに関しても同様で、ソースコードベースでレビューするのはかなり難易度が高いので、素直に開発ツールでフローチャートを確認しましょう。開発ツール自体が差分管理機能を有していない場合は、あまり差分管理の恩恵を受けることは難しいかと思います。
ここまでの内容をまとめてみましょう。
| メリット | デメリット |
|
|
デメリットで挙げた項目は、バージョン管理ツールを導入せずにファイルサーバー等で管理する場合も、同様に検討すべき内容であります。まずはパイロット部署を決めて、プレ導入をしてみることをお勧めします。その際、ブランチ管理など厳密すぎるルール定義をしてしまうと、担当者の負荷が上がり、生産性が落ちてしまうこともあるので、最初から厳しくしすぎに、ある程度幅を持たせることが重要かと思います。
慣れてくると、バージョン管理されていないことが苦痛になってきます。それほど、使い始めると便利で有効なツールです。
まだバージョン管理ツールを導入されていない方は、是非導入を検討してみてはいかがでしょうか。


