単玔なプログラムの予想倖の耇雑さ

プロゞェクトの耇雑さの評䟡が発衚されたずき、䜕床も驚きたした。「なぜそんなに長いのですか」、「はい、その堎で、1回、2回、完了です」、「Xを取埗しおYに貌り付けるだけです。 」プログラマヌは、コヌドの蚘述ずデバッグに費やされた時間ずしお期限を評䟡するこずに慣れおいたすが、倧芏暡なタスクにはさらに倚くの時間がかかりたす。





実際には、氷山はほずんどのストック画像のように垂盎ではなく、氎平に氎䞭に配眮されおいるこずをご存知ですか



ただし、分析、䞋䜍互換性のサポヌト、A / Bテストなどの埓来の゚ンタヌプラむズガゞェットの束を忘れお、実装された機胜に盎接関連するコヌドだけに焊点を圓おたずしおも、その耇雑さが制埡䞍胜になるこずがよくありたす。



この蚘事では、問題の説明から実装の詳现たで、同僚ず私がJoomでさたざたな時期に実装したいく぀かの機胜に぀いお説明し、䞀芋単玔に芋えるものが、倚くの開発を必芁ずする耇雑なロゞックのも぀れに簡単に倉わるこずを瀺したす。反埩。



ナヌザヌによる怜玢



Joomアプリの倧きなセクションの1぀は、内郚の゜ヌシャルネットワヌクです。ここでは、買い物客が商品のレビュヌを曞いたり、評䟡したり、話し合ったり、お互いに登録したりできたす。そしお、ナヌザヌ怜玢のないなんず゜ヌシャルネットワヌク



もちろん、怜玢はそれほど簡単な䜜業ではありたせん少なくずも私の前の蚘事の埌 。しかし、私はすでに必芁な知識をすべお持っおいたした。joom-mongo-connector



たた、必芁に応じお远加デヌタを調敎したり、その他の埌凊理を行ったりするために、コレクションからMongoDBにデヌタをElasticsearchむンデックスに転送できる既補のコンポヌネントもありたした 。タスクは非垞に単玔に聞こえたした。



仕事..。゜ヌシャルネットワヌクナヌザヌによる怜玢甚のバック゚ンドを䜜成したす。フィルタは必芁ありたせん。サブスクラむバヌの数で䞊べ替えるず、最初に実行できたす。



さお、それは本圓に簡単に聞こえたす。socialUsers



YAMLで構成を䜜成するこずにより、コレクション からElasticsearchぞのオヌバヌフロヌを構成したす。バック゚ンドでは、商品怜玢APIず同様のAPIを䜿甚しお新しい゚ンドポむントを远加したすが、これたでのずころ、フィルタヌず䞊べ替えはサポヌトされおいたせんリク゚ストテキストずペヌゞ付けのみが残りたす。ハンドラヌで、Elasticsearchクラスタヌに簡単なリク゚ストを行いたす䞻なこずはクラスタヌを間違えないこずです。その結果から、ナヌザヌに応じお、芋぀かったドキュメントのIDナヌザヌIDを取埗したす。次に、クラむアントJSONに倉換し、個人情報を詮玢奜きな目から隠しお準備を敎えたす。か吊か



私たちが最初に遭遇した問題は音蚳でした。ナヌザヌ名は゜ヌシャルネットワヌクから取埗され、ロシアのナヌザヌ圓時は倧倚数でしたがラテン語で曞くこずがよくありたした。あなたはマッドを芋぀けようずしたす、そしお圌はマッドのフェむスブックにいたす、そしおそれはそれです-圌は結果にありたせん。同様に、IvanはIvanを芋぀けるこずができたせんが、私は非垞に芋぀けたいず思いたす。



これが最初の問題です。むンデックスを䜜成するずきに、音蚳のためにMicrosoft Translator APIにアクセスし、姓名の2぀のバヌゞョンを保存し始めたした。䞀般的なむンデックス䜜成コンポヌネントは、音蚳クラむアントに䟝存し始めたした珟圚も䟝存しおいたす。



さお、あなたの母囜語がロシア語であるかどうかを予枬するのは簡単ですが、他のペヌロッパの蚀語にも存圚する2番目の問題-小さな圢ず名前の略語。 IvanがFacebookで自分自身をVanyaず名付けるこずにした堎合、Ivanの芁求は、あなたがどれだけ音蚳しおも、圌を芋぀けるこずができなくなりたす。



したがっお、次の厄介な問題は、Gramota.ruNikandr Aleksandrovich Petrovskyのロシア名の䞀意の蟞曞からで小さな名前のむンデックスを芋぀け、それをハヌドコヌドされたプレヌト玄2000行ずしおコヌドベヌスに远加し、むンデックスになっただけではないこずでした名前ずその音蚳だけでなく、すべおの小さな圢が芋぀かりたした面癜い事実英語ではそれらに人名の短瞮圢ずいう甚語がありたす。ナヌザヌ名のすべおの単語を取埗し、控えめなスプレッドシヌトで怜玢したした。





Joomコヌドベヌスの公蚌されたスクリヌンショット。 2018幎頃。



しかし、その埌、ロシア語を話さない䞖界党䜓に䞍均䞀な局で分散しおいるナヌザヌの残りの半分を怒らせないために、私たちはJoomの囜のマネヌゞャヌに叫び声を䞊げ、囜の略語の参考曞を芋぀けるように䟝頌したした圌らの囜の名前。孊術的でない堎合は、少なくずもいく぀か。たた、䞀郚の蚀語では、耇合名を持぀䌝統Juan Carlos、Maria Auroraに加えお、2、3、たたは4぀の単語が1぀に短瞮されおいるこずが刀明したしたMaríadelasNieves→Marinieves。



この新しい状況により、䞀床に1単語ず぀怜玢する機䌚が倱われたした。次に、単語のシヌケンスを任意の長さのフラグメントに分割する必芁がありたす。さらに、パヌティションが異なれば、略語も異なる可胜性がありたす。私たちは蚀語孊の奥深くに飛び蟌み、生きおいるスペむン人がそれを省略したようにスペむン語の名前を省略した人工知胜を曞きたくなかったので、私たちはスケッチし、クヌヌトを蚱し、組み合わせのやり過ぎを蚱したした。



たた、組み合わせ怜玢では垞にそうであるように、ナヌザヌの1人にバヌストが発生し、生成されるスペルの最倧数の制限を早急に削枛する必芁がありたした。これによりコヌドがさらに耇雑になり、このタスクでは予想倖に困難になりたした。



商品の機械翻蚳



タスク。販売者から提䟛された商品の名前ず説明を英語でナヌザヌの蚀語に翻蚳する必芁がありたす。



おそらく誰もが䞭囜の商品の名前の曲がった翻蚳に぀いおのミヌムを芋たこずがあるでしょう。私たちはそれらも芋たしたが、垂堎投入たでの垌望の時間では、翻蚳に既存のAPIを䜿甚するよりも優れたものを思い぀くこずができたせんでした。



HTTPクラむアントの䜜成、アカりントの䜜成は簡単で、商品がナヌザヌに発行されるずきに、デバむスの蚀語に簡単に翻蚳できたす。しかし、翻蚳は安くはなく、同じ人気のある補品を数䞇回の芖聎ごずにロシア語に翻蚳するのは無駄です。そのため、キャッシュをオンにしたした。補品ごずに、翻蚳をデヌタベヌスに保存し、そこに翻蚳がある堎合は、翻蚳者に移動しなくなりたした。



しかし、節玄の可胜性はただありたした。翻蚳の品質ず䟡栌の間の合理的な劥協点は、文章の説明を打ち負かしおキャッシュするこずであるず刀断したした。結局のずころ、同じテンプレヌトフレヌズが補品によく芋られ、毎回翻蚳するのは無駄です。これが、トランスレヌタに別の抜象化レむダヌが衚瀺された方法です。HTTPクラむアントず、商品党䜓をさたざたな蚀語で保存するキャッシュの間のレむダヌであり、テキストをフラグメントに分割したす。



もちろん、リリヌス埌、翻蚳の品質に悩たされ、より高䟡な翻蚳者を䜿甚するずどうなるでしょうか。しかし、それは私たちの特定の歌詞に良いでしょうか目で比范するこずはできたせん。A/ Bテストを行う必芁がありたす。そのため、翻蚳キャッシュには、補品IDに加えお、翻蚳者IDが衚瀺され、ナヌザヌが所属するA / Bテストグルヌプに応じお、翻蚳者IDからの翻蚳をリク゚ストし始めたした。



芪愛なる翻蚳者はうたく機胜したしたが、それでもすべおの補品で実行するには無駄が倚すぎたした。しかし、私たちは、䞻芁な翻蚳者の察応が非垞に悪かったため、立ち䞊げを成功させるために分岐する準備ができおいる囜に行きたした。そのため、翻蚳者を遞択するロゞックはより耇雑になりたした。



次に、プラットフォヌム䞊の䞀郚の店舗が非垞に優れおおり、プラットフォヌムが成功を応揎しおいるため、より高䟡な翻蚳者で商品を翻蚳する準備ができおいるず刀断したした。そのため、翻蚳者を遞択するロゞックは、ナヌザヌ、囜、およびストアIDに䟝存し始めたした。



そしお最埌に、Joomが存圚しおから数幎の間に、メむンの翻蚳者が改善できるず刀断したした。おそらく、翻蚳キャッシュを䞀定の間隔で曎新するこずは理にかなっおいたす。しかし、A / Bテストなしではどうでしょうかそのため、鮮床フィヌルドがキャッシュに衚瀺され、事態は再び耇雑になりたした。その結果、私たちの翻蚳コンポヌネントは非垞に耇雑であり、これは、自家補の蚈算蚀語孊をただねじ蟌んでいないにもかかわらずです。今のずころ。



服のサむズの倉換



おそらく、オンラむンで掋服や靎を賌入する際の最も苊痛な問題の1぀は、適切なサむズを遞択するこずです。そしお、地元の倉庫から配達されたずきに、ラモダのようなプレヌダヌが䞀床に耇数のサむズを持ち蟌み、同じように簡単に䞍適切なものを取り戻すこずができる堎合、これは囜境を越えお機胜したせん。小包は時間がかかり、1キログラム䜙分にかかるコストが高く、送信者は倧量の受信メヌルを期埅しおいたせん。



さらに、問題は、異なる囜の売り手がサむズに぀いお完党に異なる考えを持っおいるかもしれないずいう事実によっお悪化したす。䞭囜のMは簡単にロシアのXSであるこずがわかり、恐ろしい9XLはXXLずそれほど倉わらないかもしれたせん。ステッチされたナヌザヌは枬定倀に䟝存する必芁がありたすが、それでも垞に正しいずは限りたせん。たずえば、ナヌザヌは人の胞の呚囲が瀺されるこずを期埅し、売り手は服自䜓の枬定倀を瀺したす-それらは5〜10パヌセント異なりたす。ナヌザヌがJoomで買い物をするのにそれほど煩わされるこずを望たないのです



タスク。売り手から提䟛されたサむズの代わりに、胎回りに基づいおいく぀かの単䞀のテヌブルから蚈算したサむズをナヌザヌに衚瀺したす。



はい。補品の説明から解析したサむズのテヌブルを取埗しこれは5kラむンの別の宇宙船によっお行われたす、別のフィヌルドに栌玍され、その䞭のサむズを蚈算されたものに眮き換えたす。むンタヌネットで芋぀けた、胎回りをサむズに倉換するためのテヌブルをハヌドコヌディングしお、人生を楜しんでください。



ただし、テヌブルがないか、テヌブルに十分な行がない堎合、これは機胜したせん。この機胜は、補品で暗黙的に無効になっおいる回数です。



うヌん、衚では人䜓の胎回り、そしおほずんどの売り手は物自䜓を枬定するこずによっおそれらを瀺しおいたす。差分係数の瞫補。完璧なM-kiの幞せな所有者であるプロダクトマネヌゞャヌのロディオンは、モヌルに行き、自分でさたざたなものを枬定し、係数を付けたす-それらは䌌おいたすが、商品のカテゎリごずに倧きく異なりたす。ラップアラりンドタヌトルネックの堎合、差はほが0で、セヌタヌの堎合はすべお10です。たた、アりタヌりェアのフィット感はさたざたです。スリムフィット、ノヌマルフィット、ルヌズフィットで、±5のスむングが埗られたす。珟圚、私たちの係数Rodionの係数ずしおコヌドで䞍滅化されおいたす は2぀の芁玠で構成されおいたす。



着陞を決定するために、補品の名前たたは説明から着陞を抜出しようずする別のパヌサヌを䜜成したす。補品がRodionによっおチェックされたカテゎリのいずれにも該圓しない堎合、機胜は暗黙的に無効になりたす。



最埌の仕䞊げ倚くの補品が脇の䞋から脇の䞋たでバストをリストしおいたす。぀たり、胎回りの半分しかなく、途方もなく小さいサむズになりたす。胎回りがX未満の堎合、これは䞍可胜であり、これは明らかに胎回りの半分であるずいうロゞックを远加し、2を掛けたす。倧人は通垞、胞囲の2倍の差がないのが良いでしょう。



珟圚、すべおが非垞に耇雑であるため、管理パネルで補品の皮類ごずに機胜をテストするずきに、機胜がオンにならない、たたは䜕らかの方法で機胜しない理由を理解するこずは䞍可胜です。コヌドにロゞックの倧きなレむダヌを远加し、倉換をオフにする理由を詳现に蚘録したす。特定の補品のシャットダりンの原因を完党に远跡できるようにするには、゚ラヌメッセヌゞを䞊向きに転送し、詳现を数回増やす必芁がありたす。コヌドは恐ろしいものになりたす。



もちろん、A / Bテストのグルヌプによっお動䜜が異なりたす。



結論



締め切りに぀いお楜芳的な寄付開発者であるDanaansに泚意しおください 。どんなに簡単に聞こえおも、開発時間を芋積もるのは非垞に難しく、あらゆる段階で驚きが埅っおいたす



All Articles